1

您好,我知道这是非常基本的,但现在我很困惑,我想按顺序按user_idDESC idLIMIT 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我也尝试了很多实验,但似乎没有任何效果。我需要时间戳或其他东西来分组吗?或者什么查询会起作用?

4

5 回答 5

6

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

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

行为在这里解释

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

于 2013-10-10T13:06:42.410 回答
0

尝试这个

SELECT MAX(id) as countid , `user_id` from `table`
GROUP BY `user_id`
ORDER BY countid  DESC
LIMIT 20
于 2013-10-10T13:12:21.793 回答
0
  1. 在您的示例中,您需要获得类似的结果25,36,42,95,但按 ID 字段排序。如果你按它排序,你会得到不同的结果。

  2. 您在查询中获得了分组,因此您不能使用查询中未选择的列(此处省略了 id)

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


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

SELECT user_id FROM  `table` GROUP BY user_id ORDER BY MAX(`id`) DESC LIMIT 4
于 2013-10-10T13:18:39.413 回答
-1

您可以使用 代替分组,distinct如下面的 sql 查询。

SELECT distinct(user_id) FROM  `table` ORDER BY `id` DESC LIMIT 4
于 2013-10-10T13:05:42.107 回答
-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 ) a GROUP BY userid ORDER BY idDESC LIMIT 4

于 2013-10-10T13:08:17.257 回答