2011-04-12 85 views
0

我试图返回两个用户之间的第一条消息,无论我是发送该消息还是收到它。我编写了下面的查询,它返回所有正确的线程,但似乎忽略了DISTINCT子句 - 最后我得到了多个具有相同'someid'的结果。SELECT DISTINCT在CASE语句后不工作

如何纠正此查询,以便在结果'someid'列中不会有重复值返回?

这里就是我目前使用:

SELECT DISTINCT CASE WHEN $userid != senderid THEN senderid ELSE GROUP_CONCAT(receivers.id SEPARATOR ', ') END someid, 
      CASE WHEN $userid != senderid THEN senders.username ELSE GROUP_CONCAT(receivers.username SEPARATOR ', ') END somename, 
      messages.body, 
      messages.time 
    FROM messages 
    LEFT JOIN messages_recipients AS recipients ON messages.id = recipients.messageid 
    LEFT JOIN users AS senders ON messages.senderid = senders.id 
    LEFT JOIN users AS receivers ON recipients.userid = receivers.id 
    WHERE recipients.userid = $userid 
    OR messages.senderid = $userid 
    GROUP BY messages.id 
    ORDER BY messages.time DESC 
+0

我想你将不得不闯入2个查询,内部执行SomeId上的Distinct ... – 2011-04-13 00:10:23

+0

我会在哪里放置该查询? – Walker 2011-04-13 01:28:00

回答

2

正如@米奇小麦提到的,你可能有到DISTINCT分成外部查询。

SELECT DISTINCT * FROM 
    (
    SELECT CASE WHEN ... GROUP BY messages.id ORDER BY messages.time DESC 
    ) AS inner_q 
ORDER BY messages.time DESC 

但请记住,DISTINCT是不同的记录不是一个单一的值(someid)。 messages.time可能会阻止你得到你以后的东西。

+0

谢谢布伦特,有没有办法只返回someid = X的第一个结果? – Walker 2011-04-13 01:37:51

+0

正在寻找“AS inner_q”语法,感谢提醒我! – 2017-05-24 13:02:29