与SQL搏斗

时间:2009-11-09 20:44:49

标签: sql mysql

我在MySQL数据库中有这个:

table Message
    sender_id int
    recipient_id int
    created datetime
    [title, body, etc... omitted]

是否可以在单个查询中获取与ID为N的给定用户进行通信的所有用户的列表(意味着N显示在sender_idrecipient_id中),由created排序,包括created的最新值,没有重复项(没有发件人/收件人对N,M和M,N)?

我很确定答案是否定的,但我在说服自己时遇到了麻烦。下午精神迟钝。

如果否,您建议的最有效的替代方案是什么?


编辑:神圣的废话,Stack Overflow这些天正在跳跃。 8个答案之前我才意识到我忘了指定我希望最新的created值与每行中的其他用户ID一起出现。

6 个答案:

答案 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

就是这样:

  • 没有重复
  • 按创建的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方言的东西。