2017-06-08 5 views
0

Ich hatte Schwierigkeiten, sogar den richtigen Fragetitel zu finden. Ich werde einen Rat nehmen, um es zu bearbeiten.Zeilen nach verbundenen Tabellen in Postgres bestellen

Mein Problem: Ich habe eine app (Jobbörse) mit zwei Modellen: Benutzer, Job. Benutzer kann viele Jobs haben und Jobs können premium oder free sein. Jobs können abgelaufen oder aktiv auch sein. Sie sind aktiv, wenn valid_until Parameter IS NOT NULL, sonst sind sie abgelaufen (Ich habe einen Hintergrundjob, um dies jeden Tag automatisch einzustellen).

Ich versuche Benutzer auszuwählen, die aktive Jobs haben, aber ich möchte Benutzer mit Premium-Jobs kommen vor Benutzern mit freien Jobs vorausgesetzt, Benutzer können sowohl Premium-und kostenlose Stellenangebote zur gleichen Zeit aktiv haben.

SELECT DISTINCT users.id, users.email FROM users 
LEFT OUTER JOIN jobs ON jobs.owner_id = users.id 
WHERE jobs.valid_until IS NOT NULL; 

Above Abfrage wählt richtig Benutzer mit mindestens einem aktiven Job (entweder Prämie oder frei), ich muss nur Benutzer bestellen Tabelle nach Arbeitsplätzen. Ich werde jede Hilfe/jeden Hinweis zu schätzen wissen. Vielen Dank!

+0

Sie wollen keine Benutzer, die überhaupt keine Jobs haben, also sollten Sie (innere) Join nicht links Join verwenden. Hier funktioniert Links Join, weil es einfach so ist, dass Ihr Test für aktive/gültige Jobs diese arbeitslosen Benutzer eliminiert. Aber wenn Sie nach Jobs gefragt haben.valid_until IS NULL würden Sie auch die arbeitslosen Benutzer bekommen. Left Join gibt zurück, was innerer Join zurückgibt, plus nicht übereinstimmende linke Tabellenzeilen, die um Nullen erweitert wurden. – philipxy

Antwort

2

Ich glaube, das Folgende tun, was Sie wollen:

SELECT users.id, users.email FROM users 
JOIN jobs ON jobs.owner_id = users.id 
WHERE jobs.valid_until IS NOT NULL 
GROUP BY users.id, users.email 
ORDER BY min(case when jobs.type = 'premium' then 1 else 2 end) 

ich nicht einen Namen für das Feld, das Premium vs Free hält sehen konnte, so machte ich ein up! Auch habe ich Ihre JOIN in eine INNER JOIN geändert, da die WHERE Klausel diesen Effekt in jedem Fall hat.

+0

Ich verstehe nicht Ihre Verwendung einer 'GROUP BY'Klaus ohne Aggregationsfunktion ... – Arkhena

+0

@Arkhena, Es ist für die Aggregation in der ORDER BY benötigt ... entfernt auch Dubletten, so dass keine Notwendigkeit für DISTINCT. –

Verwandte Themen