我在MySQL数据库中有这个:
table Message
sender_id int
recipient_id int
created datetime
[title, body, etc... omitted]
是否可以在单个查询中获取与ID为N的给定用户进行通信的所有用户的列表(意味着N显示在sender_id
或recipient_id
中),由created
排序,包括created
的最新值,没有重复项(没有发件人/收件人对N,M和M,N)?
我很确定答案是否定的,但我在说服自己时遇到了麻烦。下午精神迟钝。
如果否,您建议的最有效的替代方案是什么?
created
值与每行中的其他用户ID一起出现。
答案 0 :(得分:4)
试试这个
SELECT distinct recipient_id
FROM Message
WHERE sender_id = @id
UNION
SELECT distinct sender_id
FROM Message
WHERE recipient_id = @id
union子句将删除两个查询中的重复项。实际上看着它你也不需要不同的,因为联盟也会为你做那个(任何人都知道如果使用distinct来预先过滤子句或者只是让联盟处理所有重复会更有效吗?)< / p>
答案 1 :(得分:3)
使用:
SELECT x.friend,
MAX(x.created)
FROM (SELECT t.recipient_id 'friend',
t.created
FROM MESSAGE t
WHERE t.sender_id = @id
UNION
SELECT r.sender_id 'friend',
r.created
FROM MESSAGE r
WHERE r.recipient_id = @id) x
GROUP BY x.friend
答案 2 :(得分:1)
不,这很简单。
SELECT DISTINCT IF(sender_id=4, recipient_id, sender_id) AS partner_id
FROM message
WHERE sender_id=4 OR recipient_id=4
答案 3 :(得分:1)
这是我的:)
select id, max(created) as lastMessage
(
select sender_id as id, created
from Message
union
select recipient_id as id, created
from Message
) as MergedMessage
where id = ?id
group by id
order by max(created) desc
就是这样:
答案 4 :(得分:0)
显然你在说服自己时遇到了麻烦,否则你就不会问。我很确定答案是肯定的。然而,在不了解基础数据的某些特性的情况下,找到正确的解决方案有点困难。
它可能会进入
的方向select
sender_id,
recipient_id
from
message
where
(sender_id = n or
recipient_id = n )
order by
created desc
答案 5 :(得分:0)
我认为这最符合您的要求:
SELECT *
FROM user
WHERE
user_id in
(select recipient_id FROM message m where m.sender_id = X)
OR user_id in
(select sender_id FROM message m where m.recipient_id = X)
order by
created DESC
没有重复项,没有工会,也没有特定于SQL方言的东西。