2016-03-18 2 views
1

Ich habe eine Nachrichten-Tabelle wie folgt:MySQL - Fetching Benutzer, die die neuesten Nachrichten gesendet

group_messages table

Im Grunde, was ich will, ist, ich will n Benutzer holen, die die neuesten Nachrichten an ein gesendetes Gruppe. Es muss also nach from_user_id gruppiert und in absteigender Reihenfolge nach id sortiert werden. Ich habe die folgende Abfrage:

SELECT `users`.`id` AS `user_id`, `users`.`username`, `users`.`image` 
FROM `group_messages` 
JOIN `users` ON `users`.`id` = `group_messages`.`from_user_id` 
WHERE `group_messages`.`to_group_id` = 31 
GROUP BY `users`.`id` 
ORDER BY `group_messages`.`id` DESC; 

Das Problem dabei ist, wenn ich Gruppe von user.id, die Zeile mit dem kleinsten id Feld berücksichtigt wird. Dafür bekomme ich nicht in der Reihenfolge, die id absteigend ist.

Also gibt es eine Möglichkeit, zu gruppieren, unter Berücksichtigung der größten id? Oder sollte ich es anders angehen?

Vielen Dank im Voraus.


bearbeiten: Ich glaube, ich habe es.

SELECT `x`.`id`, `users`.`id` AS `user_id`, `users`.`username`, `users`.`image` 
FROM (SELECT * FROM `group_messages` ORDER BY `group_messages`.`id` DESC) `x` 
JOIN `users` ON `users`.`id` = `x`.`from_user_id` 
WHERE `x`.`to_group_id` = 31 
GROUP BY `users`.`id` 
ORDER BY `x`.`id` DESC; 

Ich musste nur aus einer bereits geordneten Liste auswählen.

+0

Sie sollten es auf andere Weise angehen. Ein typischer Weg besteht darin, die Aggregation zu verwenden, um die neueste Nachrichten-ID abzurufen und dann den Rest der Felder beizutreten. –

+0

@GordonLinoff können Sie mich erleuchten? – OguzGelal

Antwort

0

Verwenden von Auftrag von innen Unterabfrage ist keine sehr effiziente Möglichkeit. Versuchen Sie folgendes:

users table 
| uid | name | ---------- | 

messages table 
|id | from_uid | to_group_id | ----------- | 

    SELECT u.* FROM users as u JOIN (
    SELECT g1.* 
    FROM messages g1 LEFT JOIN messages g2 
    ON g1.from_uid = g2.from_uid AND g1.to_groupid = g2.to_groupid 
     AND g1.id<g2.id 
    WHERE g2.id is NULL) as lastmessage 
    ON lastmessage.from_uid = u.uid 
    WHERE lastmessage.to_groupid = 1 
    ORDER BY lastmessage.id DESC; 

Es ist nicht gut zu haben, um durch in Unterabfragen, weil sie die Abfragen langsam und in Ihrem Fall machen u waren es auf dem ganzen Tisch läuft.

Überprüfen Sie dies Retrieving the last record in each group.

+0

@OguzGelal Lassen Sie mich wissen, ob das funktioniert. – Putty

+0

Dies scheint nicht zu funktionieren. – OguzGelal

+0

Fehler? oder es gibt nicht die erwartete Ausgabe? – Putty

Verwandte Themen