具体的mysql选择查询

时间:2012-01-14 09:09:26

标签: mysql select

今天我需要你的帮助来获得特定的sql select查询。

我有下表:

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

我尝试了很多,但没有得到确切的结果 - 所以我的方法是这样的:

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

它不是那么糟糕,但你可以看到第4行应该包含在第一行的结果中。 我希望你能帮助我。随便问一下smth是否不清楚。

提前谢谢, 问候

3 个答案:

答案 0 :(得分:7)

好的,所以既然我们知道了id_recipient的值,我们可以使用一些数学来欺骗SQL来完成这个讨厌的查询。

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

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

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

结果查询将与此非常相似。 (已经有一段时间了,但我认为我没有任何语法问题)

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已自我消息的次数。

答案 1 :(得分:0)

这个怎么样?

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_sender为1,则假定您要使用id_recipient;如果id_recipient为1,则假定您要使用id_sender。

答案 2 :(得分:0)

我相信你想要的输出应该如下

 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