Mysql
 sql >> Datenbank >  >> RDS >> Mysql

DISTINCT ON-Abfrage mit ORDER BY-Maximalwert einer Spalte

Das wäre einfach. Sie brauchen max() nicht noch DISTINCT dazu:

SELECT *
FROM   profile_visits
WHERE  social_user_id = 21
AND    created_at > (now() - interval '2 months')
AND    visitor_id <> 21  -- ??
ORDER  BY created_at DESC NULLS LAST, id DESC NULLS LAST
LIMIT  6;

Ich vermute, Ihre Frage ist unvollständig. Wenn Sie möchten:
die 6 letzten Besucher mit ihrem letzten Besuch auf der Seite
Dann brauchen Sie eine Unterabfrage. Sie können diese Sortierreihenfolge nicht in einer Abfrageebene erhalten, auch nicht mit DISTINCT ON , noch mit Fensterfunktionen:

SELECT *
FROM  (
   SELECT DISTINCT ON (visitor_id) *
   FROM   profile_visits
   WHERE  social_user_id = 21
   AND    created_at > (now() - interval '2 months')
   AND    visitor_id <> 21  -- ??
   ORDER  BY visitor_id, created_at DESC NULLS LAST, id DESC NULLS LAST
   ) sub
ORDER  BY created_at DESC NULLS LAST, id DESC NULLS LAST
LIMIT  6;

Die Unterabfrage sub erhält den letzten Besuch pro Benutzer (jedoch nicht älter als zwei Monate und nicht für einen bestimmten Besucher21 . ORDER BY muss dieselben führenden Spalten wie DISTINCT ON haben .

Sie benötigen dann die äußere Abfrage, um die 6 letzten Besucher zu erhalten.
Beachten Sie die Reihenfolge der Ereignisse:

Warum NULLS LAST ? Allerdings haben Sie die Tabellendefinition nicht angegeben.