2012-05-07 2 views
2

나는 다음 키 필드가있는 테이블이 : commentid, comment, time, parentidMySQL의 쿼리 ORDERBY의 GROUPBY,

발언은 두 가지 유형, regularreplies의이다. 보통은 상위 0을가집니다. 답장에는 응답하는 주석과 동일한 모체가 있습니다.

나는 이것들을 group by와 orderby로 알아 냈다고 생각했지만 나의 생각은 효과가 없었고 SQL에 대한 나의 지식이 초보적이기 때문에 고민 중이다.

같은 상위 항목이 함께 그룹화 된 하위 항목과 상위 항목 내에서 시간순으로 정렬되도록하려는 경우를 제외하고는 시간 DESC까지 표시하려고합니다. 나는 오직 한 수준의 대답만을 허용하고있다.

예를 들어, 나는 순서에 따라 싶습니다

time3 commentid3 parentid0 
time2 commentid2 parentid0 
    parentid2 commentid4 time4 (this one is a reply) 
    parentid2 commentid5 time5 (this one also reply) 
time1 comment1 parentid0 

나는 SELECT * from comments GROUP BY parentid ORDER BY TIME DESC을 시도하지만이 작동하지 않았다. 필요한 경우 다른 열을 추가 할 수 있습니다. 모든 제안을 부탁드립니다! 고마워.

답변

1

여기 몇 가지 가정을하고 있습니다. 귀하의 commentid가 자동으로 증가하는 ID라고 가정하고 있으므로 삽입 순서가 가장 오래된 것부터 가장 최신 인 것을 의미합니다. 자동 증가 ID를 사용하지 않거나이 테이블에 일종의 부분 저장 기능이있는 경우에는 작동하지 않습니다. 그래서 그것은 약해 보입니다.

부모 인 경우 parent_id가 null이라고 가정합니다.

SELECT commentid, comment, time, parent_id, if(parent_id = 0, commentid, parent_id) thread 
FROM comments 
ORDER BY thread desc, time asc 

어쨌든 더 자세한 정보를 추가하십시오.

Group By은 그룹화 열별로 모든 행을 하나의 행으로 그룹화하므로 사용하려는 것이 아닙니다. Group By 보통 등, 계산 또는 행의 값들을 합산으로서 총 연산에 사용

EDIT : I 시간이 오름차순으로 정렬하는 쿼리를 업데이트

, 그 응답을 제 정규 주석 넣어 것 상위에서 가장 오래된 댓글까지

+0

스레드는 어떻게 설정 되나요? commentid와 같은가요? 올바르게 이해하면 원래 스레드가 출력됩니다. 나는 disqus를 에뮬레이트하려고 노력 중입니다. 코멘트는 시간이 갈수록 짧아 지지만 답장은 답글에 들려 쓰게됩니다. 들여 쓰기는 형식 지정 문제 일 뿐이므로 각각의 부모 설명 아래에 답장이 있어야합니다. – user1260310

+0

스레드가 그 단어에 가장 적합한 단어가 아니지만 select 절에있는 경우 조건부로 설정됩니다. 따라서 parent_id가 null 인 경우 스레드 id에 대해 commentid를 사용합니다. 이는 모든 주석을 함께 정렬하고 그룹화하기위한 것입니다. – Gohn67

+0

명확히하기 위해 Thread는 실제 열이 아니며 if 함수의 별칭 일뿐입니다. 우리는 스레드가 가장 오래된 순서에서 가장 새로운 순서로 입력된다고 가정하고 그룹화 된 주석 각각을 시간 열로 정렬하기 때문에 스레드로 여기에 속임수를 쓰고 있습니다. – Gohn67

1

당신은 당신이 할 수있는 일

는 모든 datas를 검색하는 것입니다 (물론 그들이 여기에 실질적으로 사용 가능한하지 않는 것이 가지 방법이 있지만)는 SQL 쿼리에서 "나무 같은"결과를 검색 할 수 없습니다 일반 및 응답 ("일반"데이터는 많은 응답이있는 경우 복제되며 "트리"결과를 얻으려면 데이터를 가져온 후이를 처리해야 함을 의미합니다)

결과는 다음과 같습니다

regular.time, regular.commentid, replies.commentid, replies.time 

정기 답글이없는 경우 replies.comment 이드와 답장.시간이 그렇게 보일 것이다 (는 "가입 왼쪽 자기"로) 널 (null)

쿼리를하게 될 수 예를 들어 다음

select 
regular.time as regulartime, 
regular.commentid as regularid, 
replies.commentid as repliesid, 
replies.time as repliestime 
from comments regular 
left join comments replies on replies.parentid = parent.commentid 
where regular.parentid = 0 
order by regular.time desc, replies.time asc 

(지금은 쓸모없는 것 같다 일부 필드를 이동), 당신은

를 얻어야한다
time3 commentid3 null  null 
time2 commentid2 commentid4 time4 (this one is a reply) 
time2 commentid2 commentid5 time5 (this one also reply) 
time1 commentid1 null  nulll 
+0

일반 테이블과 두 테이블을 제안 하시겠습니까? – user1260310

+0

아니요 하나의 테이블이지만 쿼리의 별칭 –

+0

구문을 즉시 이해하지 못하므로 별칭을 읽어야합니다. – user1260310

1

데이터의 두 레이어를 얻으려면 원래 주석의 맨 위 레이어 만의 UNION과 모든 가능한 응답의 다른 레이어가 필요합니다. 쿼리의 첫 번째 부분의 첫 번째 열은 정렬 목적으로 1 또는 2를 유지합니다. 이것은 주어진 질문에 대한 그룹의 상단에 원래 게시물을 떠 다니는 데 사용됩니다 ... 그 후 모든 응답은 자연 순서대로 표시됩니다.

또한 원래 날짜/시간으로 적절한 그룹화를 유지하기 위해 '2'CommentType 레코드를 원래의 게시물 주석 시간으로 유지하므로 원래의 시작 시간 기준으로 정확하게 그룹화 된 상태로 머물러 있지만 실제 주석을 가져옵니다. 및 각각의 정렬에 대한 RESPONSE (별칭 "r")의 시간.

select 
     PreQuery.* 
    from 
     (select 
       '1' as CommentType, 
       c.Time as OriginalTime, 
       c.CommentID StartingCommentID, 
       c.Comment, 
       c.Time as LastTime, 
       c.CommentID as EndCommentID 
      from 
       comments c 
      where 
       c.ParentID = 0 
     UNION ALL 
     select 
       '2' as CommentType, 
       c.Time as OriginalTime, 
       c.CommentID StartingCommentID, 
       r.Comment, 
       r.Time as LastTime, 
       r.CommentID as EndCommentID 
      from 
       comments c 
       join comments r 
        on c.CommentID = r.ParentID 
      where 
       c.ParentID = 0) PreQuery 
    order by 
     PreQuery.OriginalTime DESC, 
     PreQuery.StartingCommentID, 
     PreQuery.CommentType, 
     PreQuery.LastTime 

이것은 당신이 (약간 수정)

CommentType OriginalTime StartingCommentID Comment LastTime EndCommentID 
1   Time3   ID3    Comm3 Time3  ID3 <-- ID 3 IS the start 
1   Time2   ID2    Comm2 Time2  ID2 <-- ID 2 is the start of next 
2   Time2   ID2    Comm4 Time4  ID4  <- ID4 is reply to orig ID2 
2   Time2   ID2    Comm5 Time5  ID5  <- another reply to ID2 
1   Time1   ID1    Comm1 Time1  ID1 <-- start of new comment ID1 

그래서 모든 행에 대해, 2 층과 3 열은 항상 시작하는 부모의 ID를 나타냅니다 찾고있는 생각하는 당신에게 결과를 제공한다 첫 번째 주석 및 주석 유형이 1 인 경우 주석, 마지막 시간 및 끝 주석 ID는 시작 주석의 실제 내용입니다. comment type = 2의 경우, 최종 코멘트, 최종 시간 및 종료 코멘트는 RESPONSE 레코드의 ID가됩니다.