2016-06-20 2 views
1

Предположим, что у нас есть такой sql-запрос, с объединенными данными из другой таблицы.Предел для некоторого поля

SELECT 
    pr.num, pr.resort_id, p.src_mask 
FROM 
    rutraveler.rt_photo_resort AS pr 
    JOIN rutraveler.rt_photo AS p ON pr.photo_id = p.id 
WHERE pr.resort_id = '612' AND p.src_mask is not null 
ORDER BY num 
LIMIT 30 

До сих пор мы должны были выполнить несколько запросов для нескольких resort_id.
Как изменить запрос таким образом, что у нас есть только один запрос (WHERE resort_id в (612, 333, 111) с результатом не более 30 штук в каждой resort_id?

ответ

2

Используйте ROW_NUMBER для подсчета строк в resort_id.

SELECT resort_id, num, resort_id, src_mask 
FROM 
(
    SELECT 
    pr.resort_id, pr.num, pr.resort_id, p.src_mask, 
    ROW_NUMBER() OVER (PARTITION BY pr.resort_id ORDER BY num) AS rn 
    FROM 
    rutraveler.rt_photo_resort AS pr 
    JOIN rutraveler.rt_photo AS p ON pr.photo_id = p.id 
    WHERE resort_id in (612, 333, 111) AND p.src_mask is not null 
) data 
WHERE rn <= 30 
ORDER BY resort_id, num; 
1

вы можете использовать CTE с ROW_NUMBER() и PARTITION BY

WITH Results_CTE AS 
(
    SELECT 
    pr.num, pr.resort_id, p.src_mask,ROW_NUMBER() over (PARTITION BY pr.resort_id ORDER BY num) As Row_number 
FROM 
    rutraveler.rt_photo_resort AS pr 
    JOIN rutraveler.rt_photo AS p ON pr.photo_id = p.id 
WHERE pr.resort_id IN (A,B,C) AND p.src_mask is not null 
) 

SELECT * 
FROM Results_CTE 
WHERE Row_number <= 30 
+0

Без заказа в разделе результаты неверны. – holden321

+0

@ holden321 ..thanks ... обновлено –

Смежные вопросы