2013-07-23 3 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는 MySQL을 구축하는 메시지가MySQL의 그룹 가져 오기 마지막 행

나는 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 

잘 작동하지만 나는 GROUP BY

현재는이 그룹의 첫 번째 행을 표시 message에서 마지막 행을 표시합니다.

ps.conversation_1.c_id는 자동 증가하고 MySQL Extensions to GROUP BY 아래에 설명 된대로 C_ID는

+0

"* 마지막 *"정의되지 결석 명시 적 순서의 개념. 'message' 테이블에서 어떤 메시지가 "* last *"인지 어떻게 알 수 있습니까? – eggyal

+1

message_id 자동 증분, m_id DESC m_id ORDER BY 사용하려고하지만 그것은 GROUP BY없이 한 행에 대해서만 작동합니다, 나는 두 개 이상의 행이 필요합니다 – 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

그렇게 조심이 대화에 참여있는 사람을 conversation_2을 삽입합니다 :

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 
관련 문제