将两个sql查询连接成一个不重复内容的查询

时间:2014-06-09 04:01:38

标签: php mysql sql

我一直在尝试从mysql中的表中获取聊天列表

这是表格的样子

|id|sender     |receiver        |date      |
| 1|u1         |u2              |2014-06-12|
| 2|u2         |u1              |2014-06-13|
| 3|u3         |u2              |2014-06-14|
| 4|u1         |u2              |2014-06-15|
| 5|u1         |u3              |2014-06-16|

我希望查询获取所有ID,其中u1在接收者或发件人中,但只显示最新的ID并使用日期列排序查询

预期结果是这样的

5 4

通过这种方式,它显示u1正在与u3聊天而u1正在与u2聊天(因为u2也是第二个id中的发件人,但是日期已经过去但未显示)

我尝试使用群组和加入来创建查询,但这是不可能的

由于

4 个答案:

答案 0 :(得分:1)

您可以使用内部查询查找所有行,查找发件人为id的每个接收者的最大u1,并执行外部查询以获取行并对其进行排序;

SELECT id, date FROM mytable WHERE id IN (
 SELECT MAX(id) id
 FROM mytable
 WHERE sender='u1' OR receiver='u1'
 GROUP BY CASE WHEN sender='u1' THEN receiver ELSE sender END
)
ORDER BY date DESC;

An SQLfiddle to test with

答案 1 :(得分:0)

您可以运行子查询来获取最大日期和唯一记录,然后将其连接回您的表以获取这些行的ID,如下所示:

select
    ba.id,
    ba.sender,
    ba.receiver
from
    yourTable ba
        join (
            select
                sender,
                receiver
                max(`date`) as mdate
            from
                yourTable
            where
                sender='u1'
                or receiver='u1'
            group by
                sender,
                receiver
        ) sub
            on ba.sender=sub.sender
            and ba.receiver=sub.receiver
            and ba.`date`=sub.mdate

您的表格确实使用了我建议更改的几个列名称 - 即date这是一个保留字。这将使得做任何事情的屁股都变得非常痛苦。现在,你可以保留它,但每次都会在它周围使用反引号,但我强烈建议将它更改为你不需要特殊处理的名称。

答案 2 :(得分:0)

select x.*
from mytable as x
join (
    SELECT MAX(date) as d
    FROM mytable
    WHERE 'u1' in (sender, receiver)
) as t 
    on x.date = t.d
    and 'u1' in (x.sender, x.receiver)

替代

select x.*
from mytable as x
WHERE 'u1' in (sender, receiver)
order by date desc
limit 1;

答案 3 :(得分:0)

SELECT DISTINCT id FROM TableName
WHERE
Sender = u1
OR
Receiver = u1
Order BY date DESC