2016-03-18 75 views
1

我有一個信息表如下:MySQL的 - 誰發送的最新消息抓取用戶

group_messages table

基本上我想要什麼,我想取n用戶誰發送的最新消息到組。所以它必須按from_user_id分組,並按id降序排列。我有以下查詢:

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; 

與此問題是,當我按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; 

它不好的子查詢,因爲它們會使查詢緩慢,你的情況是ü在整個表上運行它有秩序。

看看這個了Retrieving the last record in each group

+0

@OguzGelal讓我知道這是否有效。 – Putty

+0

這似乎不起作用。 – OguzGelal

+0

錯誤?或者它沒有給出預期的輸出? – Putty