Обновленный вопрос:
Вот данные
m_to m_from m_id m_time 5 5 1 1374769716 5 5 2 1374771178 5 5 3 1374771294 5 5 4 1374771396 5 5 5 1374771784 1 5 6 1374772120 1 5 7 1374773097 5 1 8 1374773579 5 1 9 1374774095 5 1 10 1374774148 1 5 11 1374777304 444 5 12 1374779752 5 444 13 1374780378 5 5 14 1374781374 5 5 15 1374832375 444 5 16 1374837258 5 444 17 1374837525 5 444 18 1374838801 444 5 19 1374838976 1 5 20 1374842736 5 5 21 1374842954 444 5 22 1374843389 5 5 23 1374843466 1 5 24 1374843853 1 5 25 1374848855 444 5 26 1374848889 5 5 27 1374848912 1 5 28 1374849001 5 5 29 1374849056 444 5 30 1374850406
Первый coulmn – «m_to» второй – m_from, а третий – m_id, а fourht – m_time
Теперь я хочу, я хочу группировать m_from и заказывать m_time. ut новое сообщение, которое когда-либо будет добавлено, должно быть сверху, а следующая строка должна быть второй … и т. д.
Я использовал.
SELECT m_from,m_time FROM messages WHERE m_to='5' GROUP BY m_from ORDER BY m_time DESC
но решает в чем-то подобном
444 1 5
поэтому, его некорректная сортировка данных ..
Если вы группируете один (или более) столбец, вам нужно сделать что-то для всех негрупповых столбцов, чтобы ваш запрос имел смысл.
Вы должны сказать, что хотите сделать со всеми сгруппированными значениями. Обычно что-то вроде SUM (), AVG (), MIN (), MAX (), GROUP_CONCAT ()
Если вы группируете m_from, то вы не сможете сортировать m_time, так как все записи для m_from будут сгруппированы вместе, а для негрупповых значений вы получите произвольный ответ, так как вы не укажите, что делать с группой.
Вероятно, вы хотите использовать агрегированную функцию, например MAX (m_time), чтобы получить максимальное значение для m_time, а затем отсортировать ее.
Я бы предложил что-то вроде этого.
SELECT MAX(m_id),m_from, MAX(m_time) as latest FROM messages WHERE m_to='XXX' OR m_from='XXX' GROUP BY m_from ORDER BY latest DESC;
Кажется, это проблема, связанная с SELECT *
и GROUP BY
. MySQL позволяет это произойти, но это может вызвать некоторые проблемы.
MySQL расширяет использование GROUP BY, чтобы список выбора мог ссылаться на неагрегированные столбцы, не названные в предложении GROUP BY. Это означает, что предыдущий запрос является законным в MySQL. Вы можете использовать эту функцию для повышения производительности, избегая ненужной сортировки и группировки столбцов. Однако это полезно, прежде всего, когда все значения в каждом неагрегированном столбце, не названном в GROUP BY, одинаковы для каждой группы. Сервер может выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными . Более того, выбор значений из каждой группы не может зависеть от добавления предложения ORDER BY . Сортировка набора результатов происходит после того, как были выбраны значения, и ORDER BY не влияет на значения в каждой группе, которую выбирает сервер.
Что касается данных, которые вы хотите, я думаю, что это сработает для вас:
SELECT * FROM `messages` ORDER BY m_from ASC, m_time DESC
Если вы хотите сначала отсортировать его по времени, просто переместите m_from ASC
до конца
РЕДАКТИРОВАТЬ
Учитывая ваш обновленный вопрос, это должно ограничивать столбцы тем, что вы хотите:
SELECT m_from, m_time FROM `messages` ORDER BY m_from ASC, m_time DESC
Вы можете получить m_from, которые соответствуют последнему сообщению, появляющемуся в верхней части списка, выполнив что-то вроде этого:
SELECT m_from, MAX(m_time) AS m_time FROM messages GROUP BY m_from ORDER BY m_time DESC
но трудно сказать, не зная, какой результат вы хотите …
РЕДАКТИРОВАТЬ :
Надеюсь, что это сработает:
SELECT m_user, MAX(m_id) as m_id, MAX(m_time) AS m_time FROM ( SELECT m_from AS m_user, MAX(m_id) as m_id, MAX(m_time) AS m_time FROM messages WHERE m_to = 5 GROUP BY m_from UNION SELECT m_to AS m_user, MAX(m_id) as m_id, MAX(m_time) AS m_time FROM messages WHERE m_from = 5 GROUP BY m_to ) AS result GROUP BY m_user ORDER BY m_time DESC