2016-06-20 3 views
1

Angenommen, wir haben eine solche SQL-Abfrage mit verknüpften Daten aus einer anderen Tabelle.Limit pro Feld

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 

Bisher müssen wir mehrere Abfragen für mehrere resort_id durchführen.
Wie die Abfrage zu ändern, so dass wir nur eine Abfrage haben (WO resort_id in (612, 333, 111) mit nicht mehr als 30 Artikel pro jede resort_id?

Antwort

2

Verwenden ROW_NUMBER die Zeilen pro resort_id zu zählen.

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

können Sie CTE mit ROW_NUMBER() verwenden und 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

Ohne in Partition Bestellung die Ergebnisse falsch sind. – holden321

+0

@ holden321 ..dank ... aktualisiert –