我有一个包含数十万个条目的表,我正在尝试使用查询来获取特定receiver_id的结果集,并通过sender_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调用此查询是否有任何问题?如果有的话,还有什么选择呢?
答案 0 :(得分:3)
我不太了解你的结构(因此,例如,这个例子假设可以在sender_id, receiver_id, date, belong_to
上强加一个UNIQUE键),但我怀疑你想要这样的东西。必要时由用户过滤..
SELECT x.*
FROM messages x
JOIN
( SELECT sender_id
, receiver_id
, MAX(date) max_date
FROM messages
GROUP
BY receiver_id
, sender_id
) y
ON y.sender_id = x.sender_id
AND y.receiver_id = x.receiver_id
AND y.max_date = x.date
WHERE x.belong_to = x.receiver_id;
答案 1 :(得分:0)
根据评论你想要的是:
'unique [特定receiver_id的sender_ids列表,其中包含每个[receiver]的最新条目(日期)
如果您的意思是所有发件人都拥有该单一接收器的最新录入日期,那么:
Select * From Messages m
Where date = (Select Max(date) From messages
Where receiver_id = m.receiver_id)
And receiver_id = 5 -- add this if you only want results for one receiver_id
如果是otoh,你的意思是 '具有最新条目(日期)的特定receiver_id的唯一sender_ids列表,每个[receiver-sender combination]',然后执行此操作
Select * From Messages m
Where date = (Select Max(date) From messages
Where Sender_id = m.Sender_id
And receiver_id = m.receiver_id)
And receiver_id = 5 -- add this if you only want results for one receiver_id