2016-03-29 5 views
1

Hinweis: Ich bin mir nicht sicher, ob ich diese Frage den führenden Titel gegeben habe, da ich mir nicht sicher bin, wie das funktioniert, aber ich konnte nirgendwo anders Beispiele finden ziemlich spezifische Abfrage.SQL - GROUP BY max Wert

Also, ich habe eine Tabelle „Stimmen“, die mit den Stimmen von anderen Nutzern gefüllt ist (eindeutig als Zahl in der identifiziert user_id Spalte), die Beiträge in einer anderen Tabelle (Abstimmung records „upvote“ entsprechen relevent jeder relevante Beitrag innerhalb der Benutzerschnittstelle).

Ich beabsichtige, diese Stimmen (von Datumzeit) in der Reihenfolge der neuesten Abstimmung für jede erstellt sortieren Post (post_id Spalte), und als solche, die Vermeidung doppelter zurückgegebenen Werte von jedem post_id.

I-Eingang die folgende Abfrage:

SELECT id, user_id, post_id, created, MAX(created) 
FROM votes 
GROUP BY post_id, user_id 
ORDER BY max(created) DESC 

Und wieder bekommen:

Table: votes 

id | user_id | post_id |  created  | MAX(created) 
----+-----------+-----------+-----------------------+-------------------- 
115 | 1   | 42  | 2014-07-03 23:08:31 | 2016-03-07 12:08:31 
----+-----------+-----------+-----------------------+--------------------   
237 | 2   | 101  | 2014-02-13 23:05:14 | 2016-03-05 23:05:14   
----+-----------+-----------+-----------------------+-------------------- 
431 | 7   | 944  | 2014-10-22 22:58:37 | 2016-03-03 19:58:37 
----+-----------+-----------+-----------------------+-------------------- 
255 | 15  | 101  | 2014-02-15 14:02:01 | 2016-02-01 23:05:14 
----+-----------+-----------+-----------------------+-------------------- 
... | ...  | ...  | ...     | ... 

Wie Sie sehen können, gibt es ein Duplikat des post_id "101". Das Ergebnis dieser Abfrage scheint nach der maximal erzeugten Zeit für jede Benutzer-ID zu sortieren, die duplizierte post_id's z. Es gibt zwei post_id Spalte Zeilen von "101", wenn ich nur die einzige post_id Spalte Wert von "101", die die maximale Zeit erstellt hat (MAX (erstellt)).

Die post_id und user_id Säulen scheinbar in Gruppen zusammengefasst werden müssen, sonst, wenn ich Gruppe nur durch post_id Ich bin nicht in der Lage von MAX zu sortieren ( erstellt), da es nicht den max zurückkehren (erstellt) für jede Post-ID.

Wie entferne ich diese duplizierten post_id Werte, die die maximal erstellte Zeit nicht zurückgeben?

Was ich nach:

Table: votes 

id | user_id | post_id |  created  | MAX(created) 
----+-----------+-----------+-----------------------+-------------------- 
115 | 1   | 42  | 2014-07-03 23:08:31 | 2016-03-07 12:08:31 
----+-----------+-----------+-----------------------+--------------------   
237 | 2   | 101  | 2014-02-13 23:05:14 | 2016-03-05 23:05:14   
----+-----------+-----------+-----------------------+-------------------- 
431 | 7   | 944  | 2014-10-22 22:58:37 | 2016-03-03 19:58:37 
----+-----------+-----------+-----------------------+-------------------- 
... | ...  | ...  | ...     | ... 
+0

Gruppieren Sie dann nicht nach user_ID. Wenn Sie nur nach dem Maximum (create) suchen und sich nicht darum kümmern, welche user_ID für diese maximalen (erzeugten) Daten zurückgegeben wird, solange sie an die gleiche Post_ID gebunden ist, dann gruppieren Sie sie nicht nach user_ID. – xQbert

+0

wenn ich nur nach post_id gruppieren kann ich nicht nach MAX (erstellt) sortieren, da es nicht die max (created) für jede post_id zurückgibt, relevant für die user_id der letzten post_id – user1228907

Antwort

1

Sie nur die letzte Stimme für jeden Beitrag wollen Unter der Annahme:

SELECT v.* 
FROM posts p 
JOIN votes v 
ON  v.id = 
     (
     SELECT id 
     FROM votes vi 
     WHERE post_id = p.id 
     ORDER BY 
       created DESC 
     LIMIT 1 
     ) 
+0

Was ist "votes vi"? – user1228907

+0

Auch dies ist nicht die MAX (erstellt) von jeder Stimme und übersieht die Tatsache, dass es mehrere Fälle, in denen eine v.post_id = p.id – user1228907

+0

Eigentlich denke ich, das funktioniert ... – user1228907

0

Wenn Sie für das Erhalten letzten user_id suchen wen post_id bearbeitet, versuchen group by post_id und Reihenfolge nach Zeit desc (oder id wenn es automatisch erhöht wird).

SELECT tbl.* , GROUP_CONCAT('(',tbl.user_id,',',tbl.created,')') as myhistory FROM 
    (SELECT id, user_id, post_id, created, MAX(created) 
    FROM votes 
    ORDER BY max(created) DESC 
    ) as tbl 
GROUP BY tbl.post_id 

Wenn Sie die Geschichte für (user_id,time) benötigen, können Sie group_concat Funktion verwenden, wie für myhistory Spalte im Code genannt.