我可以在SQL查询中安全地使用两个MAX调用

时间:2013-05-11 13:20:33

标签: mysql sql groupwise-maximum

我有一个包含数十万个条目的表,我正在尝试使用查询来获取特定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调用此查询是否有任何问题?如果有的话,还有什么选择呢?

2 个答案:

答案 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