2016-03-18 6 views
1

私は、メッセージテーブルを持っていますグループ。だから、from_user_idでグループ化し、降順でidでソートする必要があります。MySQLの以下のように最新のメッセージを送ったフェッチユーザーが

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; 

これで問題があり、Iグループuser.idにより、最小のidフィールドを持つ行が考慮されている:私は、次のクエリを持っています。そのため私が得るものはidが降順である順序ではありません。

グループ化する方法はありますか?最大でidを考慮しますか?それとも私は別の方法でアプローチすべきですか?

ありがとうございます。


編集:私は、私はそれを得たと思います。

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; 

既に注文済みのリストから選択するだけでした。

+0

別の方法でアプローチする必要があります。一般的な方法は、集約を使用して最新のメッセージIDを取得し、残りのフィールドに参加させることです。 –

+0

@GordonLinoffあなたは私を育てることができますか? – OguzGelal

答えて

0

内部サブクエリによる順序の使用は、非常に効率的な方法ではありません。

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; 

彼らはクエリが遅いとあなたのケースでuは全体のテーブルの上にそれを実行していたようになりますので、サブクエリ内で順序を持っているために、そのよくない:これを試してみてください。

これを確認してくださいRetrieving the last record in each group

+0

@OguzGelalこれが動作すれば教えてください。 – Putty

+0

これは動作していないようです。 – OguzGelal

+0

エラー?または期待された出力を与えないか? – Putty

関連する問題