2011-04-12 2 views
0

메시지를 보냈 든 수신 했든 관계없이 두 명의 사용자간에 첫 번째 메시지를 반환하려고합니다. 모든 올바른 스레드를 반환하는 아래의 쿼리를 코딩했습니다 있지만 DISTINCT 절을 무시하는 것 - 그리고 같은 'someid'함께 여러 결과가 끝납니다.CASE 문 다음에 SELECT DISTINCT가 작동하지 않습니다.

결과 'someid'열에 중복 값이 ​​반환되지 않도록이 쿼리를 어떻게 수정합니까?

는 여기에 내가 현재 사용하고있는 작업은 다음과 같습니다 @Mitch 밀이 언급 한 바와 같이

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 개의 쿼리로 나누어야 할 것입니다. 내면의 하나의 performng 인 Something on distinct ... –

+0

어디에서 그 쿼리를 넣을까요? – Walker

답변

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

감사합니다. Brent, someid = X 인 경우 첫 번째 결과 만 반환 할 수있는 방법이 있습니까? – Walker

+0

"AS inner_q"구문을 찾고 있었는데 나를 상기시켜 주셔서 감사합니다! –