는 상관 서브 쿼리보다 훨씬 더 조인, 그래서 가입 방법을 살펴 보겠습니다.
는
첫 번째 단계는 대화 당 최대 ts_send
을 얻을 수 있습니다 :
SELECT conversations_id, MAX(ts_send) AS ts_send
FROM messages
GROUP BY conversations_id;
당신은 다음 실제 메시지를 얻을 수 JOIN
에 메시지 테이블이 다시 필요합니다.conversation_id 및 MAX (ts_send)에 가입은 최신 메시지가 각 대화에 대해 반환되는 것을 보장 :
SELECT messages.conversations_id,
messages.message,
Messages.ts_send
FROM messages
INNER JOIN
( SELECT conversations_id, MAX(ts_send) AS ts_send
FROM messages
GROUP BY conversations_id
) MaxMessage
ON MaxMessage.conversations_id = messages.conversations_id
AND MaxMessage.ts_send = messages.ts_send;
위의 당신은 또한 어떤 메시지가 없었을 경우 대화가 반환이 필요하지 않는 한 후 무엇을 얻어야한다 . 이 경우에 당신은 conversations
에서 선택해야합니다 및 LEFT는 위의 질의에 가입 :
SELECT conversations.id,
COALESCE(messages.message, 'No Messages') AS Message,
messages.ts_send
FROM conversations
LEFT JOIN
( SELECT messages.conversations_id,
messages.message,
Messages.ts_send
FROM messages
INNER JOIN
( SELECT conversations_id, MAX(ts_send) AS ts_send
FROM messages
GROUP BY conversations_id
) MaxMessage
ON MaxMessage.conversations_id = messages.conversations_id
AND MaxMessage.ts_send = messages.ts_send
) messages
ON messages.conversations_id = conversations.id;
편집
관계없이 메시지가 있는지 여부의 모든 대화를 선택하는 후자 것
SELECT conversations.id,
COALESCE(messages.message, 'No Messages') AS Message,
messages.ts_send
FROM conversations
LEFT JOIN messages
ON messages.conversations_id = conversations.id
LEFT JOIN
( SELECT conversations_id, MAX(ts_send) AS ts_send
FROM messages
GROUP BY conversations_id
) MaxMessage
ON MaxMessage.conversations_id = messages.conversations_id
AND MaxMessage.ts_send = messages.ts_send
WHERE messages.ts_send IS NULL
OR MaxMessage.ts_send IS NOT NULL;
감사를 여기 spencer7593로 이동, 사람을 다음과 같이 더 나은 achived 수 위의 해결책을 제안했다.
sql friddle을 테이블 구조 및 일부 데이터와 공유 할 수 있습니까? PHP 코드가 IN이 잘못되었습니다. –
또한 여기에'JOIN'이 필요하지 않다고 생각합니다 ... –