2010-01-27 4 views
2

내 문제는 다음이다 이 예 :종속 MySQL은 SELECT

type | id | content 
M  15 "this is a message with no comments" 
M  16 "this is another message with many comments" 
R  16 "comment1" 
R  16 "comment2" 
R  16 "comment3" 
M  17 "this is another message with no comments" 

"id"는입니다.은 메시지 일 때, COMMENT.message_id은 의견 일뿐입니다. 내가 분명히 내 문제를 설명했다 희망

..

+0

댓글은 순서에 상관 없거나 ID로 주문할 수 있습니까? –

+0

'content'필드에 다른 테이블/열의 값을 포함 시키려면 정말로 쿼리가 필요합니까? 반환 된 데이터에서 메시지 내용과 주석 내용에 대해 다른 열이있는 경우 간단한 SQL 쿼리를 작성할 수 있습니다. –

답변

1
SELECT * 
FROM (
     SELECT m.id, 
       COALESCE(
       (
       SELECT id 
       FROM message_comment mc 
       WHERE mc.message_id = m.id 
       ORDER BY 
         mc.message_id DESC, id DESC 
       LIMIT 2, 1 
       ), 0) AS mid 
     FROM message m 
     ) mo 
LEFT JOIN 
     message_comment mcd 
ON  mcd.message_id >= mo.id 
     AND mcd.message_id <= mo.id 
     AND mcd.id >= mid 

빠른 작동이에 대한 message_comment (message_id, id)에 인덱스를 만듭니다.

이 작동하는 방법의 자세한 설명은 내 블로그에이 문서를 참조하십시오 : PHP는 서버 (측면)과에 의해 생성 된 HTML로 해석되기 때문에 전부

+0

답변 해 주셔서 감사합니다. 나는 쿼리를 시도했지만 코멘트가없는 메시지를 표시하지 않습니다. 어떻게 해결할 수 있습니까? – AldoB

+0

@unknown (yahoo) :'JOIN'을 'LEFT JOIN'으로 바꿉니다. 쿼리를 업데이트했습니다. – Quassnoi

+0

.. LEFT JOIN으로 JOIN을 바꾸면 NULL로 설정된 모든 값이 반환됩니다 ... – AldoB

0

클라이언트 브라우저로 가서 렌더링을 얻으십시오 ...

+1

잘못된 창인 것처럼 보입니다. :) – Quassnoi

0

저는 노동 조합의 팬이 아니지만 때로는 그들에게 그들의 장소가 있습니다. :)

SELECT type, id, content FROM ( 
SELECT 'M' AS type, id, 0 AS reply_id, content FROM MESSAGE 
UNION 
SELECT 'R' AS type, message_id AS id, id AS reply_id, content FROM MESSAGE_COMMENT) a 
ORDER BY id, reply_id 

반환

+------+----+--------------------------------------------+ 
| type | id | content         | 
+------+----+--------------------------------------------+ 
| M | 15 | this is a message with no comments   | 
| M | 16 | this is another message with many comments | 
| R | 16 | comment1         | 
| R | 16 | comment2         | 
| R | 16 | comment3         | 
| M | 17 | this is another message with no comments | 
+------+----+--------------------------------------------+ 

NB : 고아 message_comments는 우려했다 경우 UNION의 두 번째 SELECT 쉽게 MESSAGE 테이블에 INNER JOIN으로 재 작업 할 수있다.