【发布时间】:2013-05-06 00:58:23
【问题描述】:
我有一个包含数十万条目的表,我正在尝试使用查询来获取特定接收者 ID 的结果集,并按发送者 ID 对它们进行分组。我当前的 SQL 查询有效,但我想知道在语句中使用两个 MAX 调用是否存在任何潜在问题。它看起来像这样:
SELECT MAX(id) as id, sender_id, receiver_id, MAX(date) as date
FROM messages
WHERE receiver_id=5 and belong_to=5
GROUP BY sender_id
表格日期如下所示:
id sender_id receiver_id content date belong_to
-- --------- ----------- ------- ------------------- ---------
1 5 7 test 2013-03-11 10:33:54 7
2 5 7 test 2013-03-11 10:33:54 5
3 13 7 test 2 2013-03-13 12:01:36 7
4 13 7 test 2 2013-03-13 12:01:36 13
5 5 7 test 3 2013-03-14 09:15:37 7
6 5 7 test 3 2013-03-14 09:15:37 5
7 25 5 data1 2013-03-15 11:01:36 5
8 25 5 data1 2013-03-15 11:01:36 25
9 16 5 data2 2013-03-17 09:17:17 5
10 16 5 data2 2013-03-17 09:17:17 16
11 25 5 data3 2013-04-05 09:17:17 5
12 25 5 data3 2013-04-05 09:17:17 16
我的查询的输出是这样的:
id sender_id receiver_id date
-- --------- ----------- -------------------
9 16 5 2013-03-17 09:17:17
11 25 5 2013-04-05 09:17:17
这个查询使用 MAX 调用有什么问题吗?如果是这样,还有什么选择?
【问题讨论】:
-
不,这很好。但是,请意识到您可以在 select 子句中包含
Receiver_id而不按receiver_id进行分组的唯一原因是因为 where 子句将查询限制为只有一个receiver_id[5] 的值。如果结果中有多个receiver_id 值,您必须同时按receiver_id分组,或者不将其包含在结果中 -
请注意,
receiver_id将从适合该 group by 的行之一中“随机”选择,因为它不是聚合,也不会在聚合/group by 中分组询问。 (只有 MySQL 允许你这样做,所有其他 SQL 风格都会阻止这种无意义的查询。) -
请注意,不能保证两个
MAX()值都引用同一行。 -
@Pataswhu,不,他还将输出限制为仅
receiver_id = 5。这完全没问题。 -
@Paul 如果你希望它是同一行,那么 Max(Id) 和 Max(date) 的含义变得不清楚,在一行中,每个只有一个值这些列。您希望使用什么规则来识别这一行?身份证?还是日期?你不能同时使用它们,因为它们可能指向不同的行。
标签: mysql sql groupwise-maximum