我一直在尝试从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中的发件人,但是日期已经过去但未显示)
我尝试使用群组和加入来创建查询,但这是不可能的
由于
答案 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;
答案 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