2013-07-23 2 views
0
SELECT * FROM conversation_1 
LEFT JOIN conversation_2 
ON conversation_1.c_id = conversation_2.c_id 

LEFT JOIN user 
ON conversation_2.user_id = user.user_id 

LEFT JOIN message 
ON conversation_1.c_id = message.c_id 

WHERE conversation_1.user_id=1 
GROUP BY message.c_id 


conversation_1  conversation_2 
c_id user_id  c_id user_id 
1  1   1  2 
2  1   2  3 
3  2 

У меня есть сообщение DB построить в MysqlMysql группа по выборки последней строки

Я делаю 4 таблицы пользователя, conversation_1, conversation_2, сообщение о

когда пользователь попытке открыть его окно сообщения, оно будет оттенять все разговоры (conversation_1)

, чем присоединиться к пользователю conversation_2 и использования conversation_2, чтобы узнать, какой пользователь

, чем присоединиться к сообщению.

c_id user_id  user_name message 
1  2   Alex  Hi user_1, this is user_2 
2  3   John  hi user_3, user_2 don't talk to me 

он работает отлично, однако я хочу отобразить message из последней строкиGROUP BY

В настоящее время его отображение 1-й строки в этой группе.

ps.conversation_1.c_id является автоматическое приращение и c_id вставит к conversation_2, который имеет присоединиться к этой беседе

+0

Понятие "* последний *" не определено отсутствующего явного упорядочения. Как вы определяете, какие сообщения «* last *» в вашей таблице «сообщений»? – eggyal

+1

message_id является автоматическим приращением, я пытаюсь использовать ORDER BY m_id DESC, но он работает только для 1 строки без GROUP BY, мне больше 1 строки – user2178521

ответ

1
select * from (SELECT * FROM conversation_1 
LEFT JOIN conversation_2 
ON conversation_1.c_id = conversation_2.c_id  
LEFT JOIN user 
ON conversation_2.user_id = user.user_id  
LEFT JOIN message 
ON conversation_1.c_id = message.c_id  
WHERE conversation_1.user_id=1 
order by conversation_1.c_id desc) finalData 
GROUP BY message.c_id 
1

Берегись, что, как описано под MySQL Extensions to GROUP BY:

MySQL расширяет использование GROUP BY таким образом, чтобы список выбора может ссылаться на неагрегированные столбцы, не названные в предложении GROUP BY. Это означает, что предыдущий запрос является законным в MySQL. Вы можете использовать эту функцию для повышения производительности, избегая ненужной сортировки и группировки столбцов. Однако это полезно прежде всего, когда все значения в каждом неагрегированном столбце, не названном в GROUP BY, одинаковы для каждой группы. Сервер может выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными. Кроме того, на выбор значений из каждой группы не может влиять добавление предложения ORDER BY. Сортировка набора результатов происходит после того, как были выбраны значения, а ORDER BY не влияет на значения в каждой группе, которую выбирает сервер.

Это то, что происходит, чтобы выбрать сообщение (и, возможно, другие столбцы) в вашем существующем запросе.

Вместо этого, вы хотите groupwise maximum:

SELECT messages.* FROM messages NATURAL JOIN (
    SELECT c_id, MAX(m_id) m_id FROM messages GROUP BY c_id 
) t 
Смежные вопросы