2014-11-03 4 views
1

Я пытаюсь написать оператор mysql, который извлекает только уникальные сообщения из моей системы чата. Существует файл to_id и from_id. Я хочу вытащить один ряд из каждого разговора.Оператор Mysql для выбора отдельных строк из двух столбцов

Проблема заключается в том, есть ли строка с to_id = 1 from_id = 2 и другой ряд с to_id = 2 from_id = 1 Я хочу обоих этих строк, которые будут рассматриваться как то же самое.

Утверждение, которое я придумал, это «SELECT * FROM chat_messages GROUP BY to_id, from_id». Это работает, за исключением ситуации, о которой я говорил выше.

Еще одна попытка, которую я сделал, заключалась в том, чтобы использовать «SELECT DISTINCT наименьшее (to_id, from_id) как значение1, наибольшее (to_id, from_id) как значение2 из chat_messages».

Это возвращает то, что мне нужно, но я не знаю, как получить остальную информацию из строки, как сообщение, метка времени и т.д. Это дает только мне значение1 & значение2 которые являются to_id & from_id.

ответ

2

Просто используйте выражение во втором запросе для GROUP BY первого запроса:

SELECT * FROM chat_messages GROUP BY LEAST(to_id,from_id), GREATEST(to_id,from_id) 
+0

@ hunijkah: Мой ответ, вероятно, заслуживает внимания. Примерный запрос зависит от расширения, специфичного для MySQL, для поведения GROUP BY. Оператор вернет ошибку в MySQL, если включен режим SQL ONLY_FULL_GROUP_BY'. Запрос этой формы возвращает ошибку в СУБД, отличную от MySQL (например, SQL Server, Oracle, Teradata, DB2 и др.) – spencer7593

+1

Это замечательно, но как заказать это, чтобы вернуть самую последнюю строку. Я пробовал с порядком по id desc, но он всегда возвращает самый низкий id –

+0

Мне было интересно, как мне отсортировать новейшие? – Arda

0

Если второй запрос возвращает то, что вы ожидаете, то ниже запрос возвращает остальное информации:

SELECT * 
FROM chat_messages t1 INNER JOIN (
    SELECT DISTINCT LEAST(to_id, from_id) AS value1, 
     GREATEST(to_id, from_id) AS value2 
    FROM chat_messages 
) t2 ON t1.to_id = value1 AND t1.from_id = value2; 
Смежные вопросы