2011-10-05 83 views
1

我有一些消息和当前用户。如何执行此SQL查询?

消息有一个id,用户有一个id

我想要得到的(唯一的)用户ID的列表,其中:

的第一个用户id是谁最高的消息id 和所有的消息ID的邮件发送到了当前用户的用户最后一个用户标识比任何其他发送当前用户消息的用户的标识要低。

到目前为止,我能得到谁与发送的当前用户信息的用户的列表:

"SELECT sender_id AS messgr_id FROM messages 
    WHERE receiver_id = '$curr_id' 
UNION SELECT receiver_id AS messgr_id FROM messages 
    WHERE sender_id = '$curr_id' "; 

,但我坚持以订购它的方式我想最好的方式(我正在学习SQL,因为我这样做,所以我没有专家:))

谢谢!

+0

你能简单地解释一下你的db模式吗? – Landon

+0

你想要输出什么?所有发送到或收到来自current_user的消息的用户的ID?或者只是发送最后一条消息并从current_user收到最后一条消息的2个用户的ID? –

+0

- 所有用户的ID ...但列表应该是唯一的... – algorithmicCoder

回答

2

这样的事情应该做的伎俩

SELECT * 
FROM ( 
    SELECT sender_id AS messgr_id FROM messages 
     WHERE receiver_id = '$curr_id' 
    UNION SELECT receiver_id AS messgr_id FROM messages 
     WHERE sender_id = '$curr_id' 
) T1 
GROUP BY messgr_id 
ORDER BY messgr_id DESC 

这会给你的用户ID消除了复制功能列表,排序高到低。


更新

重读你的问题,这听起来像你正在寻找通过消息 ID排序的用户ID的列表 - 这是不是在目前的显示例。假设你messages表有一个id列(除了receiver_idsender_id),这里是你会怎么做:

SELECT messgr_id, max(message_id) as max_message_id 
FROM ( 
    SELECT sender_id AS messgr_id, id as message_id FROM messages 
     WHERE receiver_id = '$curr_id' 
    UNION SELECT receiver_id AS messgr_id, id as message_id FROM messages 
     WHERE sender_id = '$curr_id' 
) T1 
GROUP BY messgr_id 
ORDER BY max_message_id DESC 
+0

非常感谢更新的答案可能是我正在寻找...我可以用英语表达,但不是在代码中......将尝试并尽快接受!再次感谢! – algorithmicCoder

+0

嗯,你确定选择内部选择“ID”是好的... ...它似乎将“拆分联盟”成非唯一的用户ID,因为消息ID不同... – algorithmicCoder

+0

或做组messgr_id解决这个问题? – algorithmicCoder

0

我不知道,但我认为你只需要订购你的选择?

"SELECT sender_id AS messgr_id FROM messages 
    WHERE receiver_id = '$curr_id' 
    ORDER BY sender_id 
UNION SELECT receiver_id AS messgr_id FROM messages 
    WHERE sender_id = '$curr_id' 
    ORDER BY sender_id DESC"; 
+0

OP询问没有重复,这意味着GROUP BY或DISTINCT将成为等式的一部分。 – Lee

+0

其实 - 我纠正了。联盟将负责消除重复。 – Lee