使用GROUP BY时获取desc或最后插入的数据

时间:2018-06-24 08:59:39

标签: php mysql sql mysqli greatest-n-per-group

有温暖的祝福。

我有一个包含大量数据的表,我需要所有数据,但是例如最后更新的数据

Table

id  -   name    -   user_id -   email
1   -   abc     -   1   -   abc@email.com
2   -   xyz     -   2   -   xyz@email.com
3   -   abc     -   1   -   abc@email.com
4   -   pqr     -   3   -   pqr@email.com
5   -   abc     -   1   -   abc@email.com
6   -   pqr     -   4   -   pqr@email.com

现在我查询类似这样的东西

SELECT MAX(id),* 
FROM `table`
GROUP BY user_id 
ORDER BY id DESC

但是它没有返回预期的输出。我的预期输出是

id  -   name    -   user_id -   email
5   -   abc     -   1   -   abc@email.com
2   -   xyz     -   2   -   xyz@email.com
4   -   pqr     -   3   -   pqr@email.com
6   -   pqr     -   4   -   pqr@email.com

仅显示最后插入的数据。我指的是this答案,但它并非用于获取所有数据。那么,如何在对id进行分组时获取最后插入的所有数据?

2 个答案:

答案 0 :(得分:2)

您可以在同一表上使用自我联接以选择每个用户的最新行

SELECT a.* 
FROM `table` a
JOIN (
    SELECT user_id , MAX(id) id
    FROM table
    GROUP BY user_id 
) b ON(a.user_id = b.user_id AND a.id = b.id)
ORDER BY a.id DESC

Demo

答案 1 :(得分:1)

特别是如果要订购最终结果,则应考虑使用相关子查询:

select t.*
from t
where t.id = (select max(t2.id)
              from table t2
              where t2.user_id = t.user_id
             )
order by t.id desc;

为了提高性能,您希望在(user_id, id)(id)上建立索引。