2016-05-18 4 views
3

Ich habe ein modales Notifications und ein Benutzermodal, wo Benutzer viele Benachrichtigungen hat und die Benachrichtigungen zwischen Benutzern gesendet werden. Ich brauche eine Funktion, um die neueste Benachrichtigung von jedem Benutzer zu erhalten, und sie nach ihren Zeitstempeln sortiert zurückzugeben.Rails wählen distinct und Reihenfolge von den letzten

habe ich versucht, SELECT DISTINCT .. ORDER BY mit:

@notifications = Notification.select("DISTINCT(notifier_id, created_at)").order('created_at DESC') 

, die diese SQL erzeugt: SELECT DISTINCT(notifier_id, created_at) FROM "notifications" ORDER BY "notifications"."created_at" DESC, created_at DESC)

aber ich habe den Fehler: SELECT DISTINCT, ORDER BY expressions must appear in select list

created_at erscheint in der Auswahlliste, also, was ist das Problem?

zu diesem Beitrag Basierend: PG::Error: SELECT DISTINCT, ORDER BY expressions must appear in select list

I SELECT versucht mit ... GROUP BY .. ORDER BY:

@notifications = Notification.select("notifier_id").group("notifier_id").order("MAX(created_at)") 

, die diese SQL erzeugt: SELECT "notifications"."notifier_id" FROM "notifications" GROUP BY notifier_id ORDER BY "notifications"."created_at" DESC, MAX(created_at)

aber jetzt das ich Fehler: column "notifications.created_at" must appear in the GROUP BY clause or be used in an aggregate function

Ich verwende eine Aggregatfunktion, also worum geht es bei dem Fehler?

UPDATE:

Mit diesem Code:

@notifications = Notification.select("DISTINCT ON (created_at) created_at, notifier_id").order('created_at DESC') 

ich eine Liste aller Nachrichten zurück, anstatt nur die neuesten von jedem Sender.

+0

Die Fehlerausgabe, die Sie bekommen, sagt Ihnen im Grunde, was Sie beheben müssen. Hast du das versucht? –

+0

Können Sie erklären, was die Grundlösung ist? – Cbas

+0

Ihre zweite 'GROUP BY' Abfrage ist ein bisschen chaotisch. Könnten Sie einige Beispieldaten zusammen mit dem gewünschten Ergebnis veröffentlichen? Dies ist eher ein Postgres-Problem als ein Ruby-Problem. –

Antwort

1

Versuchen Sie folgendes:

@messages = Message.select("DISTINCT ON (created_at) created_at, sender_id").order('created_at DESC') 

Vom documentation:

The DISTINCT ON expression(s) must match the leftmost ORDER BY expression(s).

Sie die zweite Abfrage pro die Fehlermeldung zu überarbeiten müssen.

+0

das läuft Ok, aber jetzt bekomme ich einen Fehler in Bezug auf ein Attribut nicht vorhanden, wenn ich versuche, die Nachricht auszudrucken. Muss ich jedes Attribut, das ich abrufen möchte, sowohl in Auswahl als auch in Gruppe einschließen? Wenn ja, gibt es eine sauberere Möglichkeit, dies zu schreiben, wenn ich sage, dass 12 Attribute abgerufen werden sollen? – Cbas

+0

@Cbas In Postgres müssen Sie die Spalten einfügen, die Sie in der 'GROUP BY'-Klausel auswählen _unless_ Sie erscheinen innerhalb von Aggregatfunktionen (z. B.' SUM'). Ihr Fehler ist möglicherweise ein allgemeines SQL-Problem und keine Einschränkung in meiner Antwort. –

+0

Ok danke, ich konnte dieses Problem beheben, aber jetzt bekomme ich eine Liste aller Nachrichten zurück, nicht nur die neuesten von jedem Absender. Gibt es eine Möglichkeit, zu verhindern, dass mehrere Nachrichten von denselben Benutzern zurückgegeben werden? Ich habe den Code in das Update kopiert und eingefügt – Cbas

Verwandte Themen