您好,我知道这是非常基本的,但现在我很困惑,我想按user_id
顺序分组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
我也尝试了许多实验,但似乎没有任何效果。我需要时间戳或其他东西才能分组吗?或者什么查询会起作用?
您正在执行部分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 不会 影响服务器在每个组中选择的值。
-
在您的示例中,您需要获得类似
25,36,42,95
的结果,但按 ID 字段排序。如果你按它排序,你会得到不同的结果。 -
您在查询中获得一个分组,因此您不能使用未在查询中选择的列(id在此处省略(
-
如果您仍然需要按 id 排序,我认为您需要按 MAX('id'( 或 MIN('id'( 添加订单
在您的情况下,我将进行下一个查询:
SELECT user_id FROM `table` GROUP BY user_id ORDER BY MAX(`id`) DESC LIMIT 4
试试这个
SELECT MAX(id) as countid , `user_id` from `table`
GROUP BY `user_id`
ORDER BY countid DESC
LIMIT 20
代替分组,您可以使用 distinct
,就像下面的 sql 查询一样。
SELECT distinct(user_id) FROM `table` ORDER BY `id` DESC LIMIT 4
选择 * FROM (选择 13 个 ID、25 个用户 ID全部联盟选择 12 个 ID、36 个用户 ID全部联盟选择 11 个 ID,25 个用户 ID全部联盟选择 10 个 ID、42 个用户 ID全部联盟选择 09 个 ID, 95 个用户 ID全部联盟选择 08 个 ID, 25 个用户 ID全部联盟选择 07 个 ID, 95 个用户 ID( 一按用户 ID 排序 按id
定义限制 4