2012-01-13 8 views
2

Вот мой код:SQL GROUP BY выбора

mysql_query("SELECT * FROM messages WHERE to_user_id = '$user_id' GROUP BY from_user_id ORDER BY read,sent_date DESC")

и вот моя структура таблицы

enter image description here

Я использую GROUPY BY from_user_id заявление кратко показать список "разговоров" вместо каждого отдельного сообщения. Как это

enter image description here

Но, как вы можете видеть на картинке, два верхних навыворот, первый говорит «1 неделю назад» и один ниже говорит «2 дня назад ». Причина того, что они находятся в неправильном порядке, вызвана оператором GROUP BY from_user_id. Потому что он группирует все сообщения от этого пользователя, и он не будет иметь самое последнее время на нем.

Так что мой вопрос:

Как я могуGROUP BY from_user_idсамым последним запись?

+0

Какое программное обеспечение базы данных? –

+0

Просто переделал его MySQL. Это должно быть из-за оператора mysql_query во включенном PHP-коде, и потому, что только MySQL позволяет вам злоупотреблять семантикой GROUP BY таким образом. : S –

+0

Группировка from_user_id означает, что для сообщений от этого пользователя будет один вывод строки, независимо от того, сколько целых цепочек (-ов) он участвует. В вашей таблице есть поле идентификатора беседы? –

ответ

1

Try с этим

SELECT *,MAX(id) as OrderField FROM messages WHERE to_user_id = '$user_id' 
GROUP BY from_user_id 
ORDER BY OrderField DESC,read 
2

Поскольку MySQL не поддерживает такие функции, как оконный ROW_NUMBER() OVER() вы можете сделать что-то вроде этого:

SELECT * 
FROM Messages 
where id in (SELECT MAX(ID) FROM messages GROUP BY from_user_id) 
ORDER BY sent_date, read 

подзапроса будет возвращать только новейший идентификатор сообщения для каждого пользователя. Я предполагаю, что ваш auto_increment соответствует порядку отправки сообщений. Даже если это не точная логика, которую вы можете захотеть, это общий метод получения определенного подмножества значений из сгруппированных записей, которые работают в MySQL.

6

Вы не можете использовать SELECT столбцы, не указанные в GROUP BY или иным образом allowed functions. Это how GROUP BY works.

Несмотря на то, что большинство подобных SQL-запросов не удалось выполнить такой запрос, MySQL этого не делает. Вместо этого он предоставляет произвольные результаты - что вы видите.

Вы можете решить эту проблему несколькими способами. Например:

  • SELECT в идентификаторах из последних разговоров пользователей, использующих GROUP BY в отдельном запросе.
  • Сделайте все в одном запросе, выбрав ids или JOIN набор ids.