2013-06-23 4 views
0

내 개인용 메시징 시스템을 내 앱에 구축하려고합니다. 각 메시지를 설정하는 방법은 thread_hash과 관련이 있습니다. 서로 관련된 메시지가 동일한 thread_hash (다른 메시지에 대한 회신 메시지는 모두 thread_hash입니다.)MySQL : 결과와 함께 발생 행 수를 결합하십시오.

각 그룹에서 마지막으로 입력 한 행을 선택하는 쿼리를 실행할 수 있습니다 (thread_hash). '에스). 는 내가 달성하고자하는 것은 내가 행을 생성하는 데 사용하고 쿼리와 함께 SQL 바이올린을 만든

별도의 쿼리를하지 않고 특정 thread_hash이 행의 수와 다른 열을 반환하는 것입니다 : http://sqlfiddle.com/#!2/1d8bd/4

유일한 정보는 사용자의 ID입니다. 나는 thread_hash을 가지지 않으므로 ID에서 생성되어야합니다. 행의 수를 생성하기 위해 몇 가지 쿼리를 가지고 놀았지만이 시간에는 뇌가 제대로 작동하지 않습니다.

답변

1

같은 쿼리를 찾고 생각 :

SELECT 
    thread_hash, 
    from_user_id, 
    mark_read, 
    subject, 
    SUBSTRING(message, 1, 65) as message, 
    messages.time_stamp, 
    cnt 
FROM 
    `messages` 
    JOIN (SELECT MAX(messages.id) thead_id, COUNT(*) cnt 
     FROM messages 
     WHERE messages.to_user_id = 28 
     GROUP BY thread_hash) thread_head 
    ON `messages`.`id` = `thread_head`.`thead_id` 
WHERE `to_user_id` = '28' 
ORDER BY `messages`.`time_stamp` ASC 
LIMIT 20 

바이올린이 here입니다.

하지만 사용자 28 또는 모든 메시지의 메일 만 계산해야하는지 잘 모르겠습니다. 모든 메시지를 계산해야하는 경우, 당신은 당신의 하위 쿼리이 방법을 다시 작성할 수 있습니다 :

(SELECT MAX(CASE WHEN messages.to_user_id = 28 THEN messages.id END) thead_id, 
     COUNT(*) cnt 
FROM messages 
GROUP BY thread_hash) thread_head 

이 바이올린 here를 참조하십시오.

1

나는 당신이 당신의 쿼리를이 방법을 쓸 수 있습니다 당신이

SELECT COUNT(*) AS number_msg, thread_hash, from_user_id, mark_read, subject, SUBSTRING(message, 1, 65) as message, messages.time_stamp 
FROM `messages` 
WHERE `to_user_id` = '28' 
GROUP BY thread_hash 
ORDER BY `messages`.`time_stamp` ASC 
LIMIT 20