2010-04-14 3 views
3

이것은 SQL 질문이며 어떤 유형의 JOIN, GROUP BY 등을 사용할지는 알지 못합니다. 메시지는 객실과 매일 객실과 관련이있는 채팅 프로그램 용입니다 내역을 출력 할 때 기본적으로 해당 내역에서 채팅 한 사용자를 표시해야합니다. 순간 나는과 같이 메시지를 통해 연결 : 나는 한 성적 증명서 항목을 나타내는 배열의 각 요소와 대한 생각 싶습니다SQL 그룹 결과 열 배열

Array 
(
    [0] => Array 
     (
      [id] => 2 
      [name] => Room 2 
      [niceDate] => Wednesday, April 14 
      [date] => 2010-04-14 
      [long] => Jerry Seinfeld 
     ) 

    [1] => Array 
     (
      [id] => 1 
      [name] => Room 1 
      [niceDate] => Wednesday, April 14 
      [date] => 2010-04-14 
      [long] => Jerry Seinfeld 
     ) 

    [2] => Array 
     (
      [id] => 1 
      [name] => Room 1 
      [niceDate] => Wednesday, April 14 
      [date] => 2010-04-14 
      [long] => Test Users 
     ) 

) 

:

SELECT rooms.id, rooms.name, niceDate, room_transcripts.date, long 
FROM room_transcripts 
    JOIN rooms ON room_transcripts.room=rooms.id 
    JOIN transcript_users ON transcript_users.room=rooms.id AND transcript_users.date=room_transcripts.date 
    JOIN users ON transcript_users.user=users.id 
WHERE room_transcripts.deleted=0 AND rooms.id IN (1,2) 
ORDER BY room_transcripts.id DESC, long ASC 

결과 집합은 다음과 같습니다 사용자는 배열에서 항목의 요소로 그룹화됩니다. 'long'은 모든 이름을 나열하는 배열입니다. 이 작업을 수행 할 수 있습니까?

지금은 이름을 추가하고 사본 날짜와 방이 바뀌면 소급하여 회신하지만 나는 파일과 강조 표시된 메시지에 대해 동일한 작업을 수행하며 지저분합니다.

감사합니다.

+0

관계형 모델의 구조로 인해이 작업은 PHP에서 사후 쿼리로 처리하는 것이 가장 좋습니다. – outis

답변

4

각 배열 요소가 테이블의 행을 나타내므로 배열에 결과에 long 필드를 사용할 수 없습니다. 그러나 대신 concatened 문자열을 가질 수 있으며 필요한 경우 문자열을 분할 할 수 있습니다. 쿼리는 다음과 같이 표시됩니다.

SELECT rooms.id, rooms.name, niceDate, room_transcripts.date, group_concat(long) as long 
FROM room_transcripts 
    JOIN rooms ON room_transcripts.room=rooms.id 
    JOIN transcript_users ON transcript_users.room=rooms.id AND transcript_users.date=room_transcripts.date 
    JOIN users ON transcript_users.user=users.id 
WHERE room_transcripts.deleted=0 AND rooms.id IN (1,2) 
GROUP BY room_transcripts.id 
ORDER BY room_transcripts.id DESC