具体的mysql选择查询

问题描述:

今天我需要你的帮助来得到一个特定的sql select查询。具体的mysql选择查询

我有下表:

table with all results

和关于特定的ID(在这种情况下ID 1)我想有这样的结果的特定的查询后:

USER_ID(别名对于id_sender/id_recipient),日期(也许是最大的功能,因为我想拥有最新的日期组),邮件(计数功能的消息):

10 | 2012-01-14 09:10:05 | 4 
11 | 2012-01-13 13:52:49 | 1 
13 | 2012-01-13 20:01:17 | 1 
14 | 2012-01-14 09:20:17 | 1 

我tryed很多,但没有得到确切的结果 - 所以我的做法是这样的:

SELECT `id_recipient`, `id_sender`, MAX(`date`) AS `date`, COUNT(*) AS `messages` FROM `table` WHERE `id_recipient` = 1 OR `id_sender` = 1 GROUP BY `id_recipient`, `id_sender` 

但后来我得到这样的结果:

my approach

它不是那么糟糕,但作为你可以看到第四行应该包含在第一行的结果中。 我希望你能找到我。随时询问,如果不清楚。

在此先感谢, 问候

好了,因为我们知道id_recipient值,我们可以用一些数学诱骗到SQL完成这个令人讨厌的查询。

设n是感兴趣的人的id值。

我们知道id_recipient和id_sender的配对总是包含id值为n的用户。基于where子句。

因此,id_recipient + id_sender == n + id_otherPerson为true。

生成的查询与此非常相似。 (它已经有一段时间,但我不认为我有什么语法问题)

SELECT (`id_recipient` + `id_sender` - n) AS `id_otherPerson`, 
     MAX(`date`) AS `date`, COUNT(*) AS `messages` 
FROM `table` 
WHERE `id_recipient` = n XOR `id_sender` = n 
GROUP BY `id_otherPerson`; 

编辑:我把它改成一个XOR,因此,如果人n条消息的人N,也不会造成所有的值都会增加n的消息次数。

+0

1 + 10 - 1 = 10和10 + 1 - 1 = 10 – JustinDanielson 2012-01-14 09:31:15

+0

该死的,从来没有想过这样的 - 这真是一个很好的处理这样一个问题的方式 - 我会记住这个同样的问题! – user1104419 2012-01-14 09:32:30

+0

它完成了工作吗? – JustinDanielson 2012-01-14 09:34:16

这个怎么样?

SELECT user_id, MAX(date), COUNT(*) 
FROM (
    SELECT id_recipient AS 'user_id', date 
    FROM table 
    WHERE id_recipient <> 1 AND id_sender = 1 
    UNION 
    SELECT id_sender AS 'user_id', date 
    FROM table 
    WHERE id_recipient = 1 AND id_sender <> 1 
) AS tbl 
GROUP BY user_id 

它假定您要使用id_recipient如果id_sender为1,如果id_sender是id_recipient 1

我相信你想应该是如下

10 | 2012-01-13 20:01:17 | 3 
11 | 2012-01-13 13:52:49 | 1 
13 | 2012-01-13 20:01:17 | 1 

我说因为你是混合id_recipient和输出id_sender

+1

他想将1到10之间的任何通信分组。不管1是发送者还是接收者。 14应该包括在内,因为14收到来自1. – JustinDanielson 2012-01-14 09:30:25

+0

的消息好吧...让我检查... – 2012-01-14 09:30:55

+0

justinDanielson是对的 - 我想收集两个用户之间的所有消息,不仅仅是发送或接收的消息。 – user1104419 2012-01-14 09:33:46