SELECT DISTINCT не работает после оператора CASE - PullRequest
0 голосов
/ 13 апреля 2011

Я пытаюсь вернуть первое сообщение между двумя пользователями, отправил ли я это сообщение или получил его. Я кодировал приведенный ниже запрос, который возвращает все правильные потоки, но, похоже, игнорирует предложение DISTINCT - и в результате я получаю несколько результатов с одним и тем же 'someid'.

Как исправить этот запрос, чтобы в результирующем столбце '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

1 Ответ

3 голосов
/ 13 апреля 2011

Как уже упоминалось @Mitch Wheat, вам, вероятно, придется разделить 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 может помешать вам получить то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...