2013-04-09 7 views
5

Ich habe eine SQL-AnweisungProper Paginierung in einem JOIN wählen

select * 
from users u left join files f 
on u.id = f.user_id 
where f.mime_type = 'jpg' 
order by u.join_date desc 
limit 10 offset 10 

Die Beziehung ist 1-N: Benutzer viele Dateien haben.

dies effektiv wählt die zweite 10-Element-Seite.

Das Problem ist, dass diese Abfrage Grenzen/Offsets einer verknüpften Tabelle begrenzt, aber ich möchte bestimmte Zeilen aus der ersten (users) Tabelle begrenzen/versetzen.

Wie geht das? Ich ziele auf PostgreSQL und HSQLDB

Antwort

8

Sie müssen zuerst die Auswahl auf der äußeren Tabelle begrenzen und dann die abhängige Tabelle mit dem Ergebnis verbinden.

select * from (select * from users limit 10 offset 10) as u 
left join files f 
    on u.id = f.user_id 
+0

Können Sie in der Unterauswahl 'order by' bestellen und' where' in der 'files' Tabelle hinzufügen? – Queequeg

+0

Ja, aber die Sortierung nach der Unterauswahl unterscheidet sich je nachdem, wie Sie das tun (innerhalb oder außerhalb der Unterauswahl). Aber du kannst beides zusammen machen. –

+0

Ich denke, das wird nur die Benutzer mit Dateien mit f.mime_type = 'jpg' für den zehnten ersten Benutzer auswählen. Es bedeutet, dass Sie nicht 10 Ergebnisse haben werden, aber N Ergebnisse mit N lpratlong