如何按用户ID分组并按desc排序

时间:2013-10-10 13:02:41

标签: php mysql sql group-by

您好我知道这是非常基本的但是现在我很困惑我想要GROUP BY user_id ORDER BY id DESC LIMIT 4(我已经发布了表和我的查询的简短示例)

我的表看起来像id是自动增量我只保存user_id我只想要一个user_id只有一次,这是数据库中最新的条目忽略其他。

Table
---------------------
id     |   user_id  |
---------------------
13     |    25      |
12     |    36      |
11     |    25      |
10     |    42      |
9      |    95      |
8      |    25      |
7      |    95      |
---------------------
so on

我试过这个

SELECT * FROM  `table` GROUP BY user_id ORDER BY `id` DESC LIMIT 4

我希望它输出25,36,42,95我也尝试了很多实验,但似乎没有任何效果。 我是否需要时间戳或其他东西来组成团体?或者什么查询将起作用?

5 个答案:

答案 0 :(得分:6)

你正在做一个部分GROUP BY,它不会按你期望的方式工作。这是一个产生所需结果的查询:

SELECT MAX(id) AS MAXID, user_id
FROM `table`
GROUP BY user_id
ORDER BY MAXID DESC
LIMIT 4

行为是explained here

  

MySQL扩展了GROUP BY的使用,以便选择列表可以引用   未在GROUP BY子句中命名的非聚合列。 [...] 您可以   使用此功能可以避免不必要的操作来获得更好的性   列排序和分组。但是,这在以下情况下非常有用   在GROUP BY中未命名的每个非聚合列中的所有值都是   每组都一样。 服务器可以自由选择任何值   每个组,所以除非它们相同,否则选择的值是   不定。此外,从每个组中选择值   不能通过添加ORDER BY子句来影响。排序   结果集在选择值后发生,而ORDER BY则不会   影响服务器选择的每个组中的哪些值。

答案 1 :(得分:0)

试试这个

SELECT MAX(id) as countid , `user_id` from `table`
GROUP BY `user_id`
ORDER BY countid  DESC
LIMIT 20

答案 2 :(得分:0)

  1. 在您的示例中,您需要获得25,36,42,95之类的结果,但需要按ID字段排序。 如果你按它排序,你会得到不同的结果。

  2. 您的查询中有一个分组,因此您无法使用未在查询中选择的列(id在那里被忽略)

  3. 如果您仍然需要按ID订购,我认为您需要按MAX('id')或MIN('id')

  4. 添加订单

    在你的情况下,我将进行下一个查询:

    SELECT user_id FROM  `table` GROUP BY user_id ORDER BY MAX(`id`) DESC LIMIT 4
    

答案 3 :(得分:-1)

您可以使用distinct代替分组,而不是分组。

SELECT distinct(user_id) FROM  `table` ORDER BY `id` DESC LIMIT 4

答案 4 :(得分:-2)

SELECT * FROM( SELECT 13 id,25 UserID UNION ALL SELECT 12 id,36 UserID UNION ALL SELECT 11 id,25 UserID UNION ALL SELECT 10 id,42 UserID UNION ALL SELECT 09 id,95 UserID UNION ALL SELECT 08 id,25 UserID UNION ALL SELECT 07 id,95 UserID ) 一个 GROUP BY userid ORDER BY id DESC LIMIT 4