2010-01-25 5 views
3

읽지 않은 메시지를 가져 오는 SQL 쿼리를 작성했지만 코드 (속도 및 가독성)를 향상시킬 수 있다고 생각합니다. 첫 번째 select는 COUNT 함수 용이고 두 번째 select는 conversation_id에 따라 메시지를 그룹화하기위한 것이고, 마지막 중첩 select는 마지막 메시지를 선택하는 것입니다.이 SQL 쿼리를 다시 작성하십시오

제게 제안 해주세요. 미리 감사드립니다.

SELECT COUNT(*) as unreaded FROM ( 
    SELECT id 
    FROM (
    SELECT id, conversation_id 
    FROM messages 
    WHERE to_id = ? 
    AND readed = 0 
    and NOT hide_from = ? 
    ORDER BY sended DESC 
) AS temp_messages 
    GROUP BY conversation_id 
) as temp_messages2 
+5

의 목록에없는 때문에 16,

  • GROUP BY 작동하지 않습니다, 또한 "unreaded"하지 않고 "발송에 실패"의 "읽지 않은" "전송". 그것들은 가독성을 향상시킬 것입니다;) –

  • +0

    읽지 않은 총 메시지 수만 원하십니까? 아니면'읽지 않은 이드, conversation_id'? 'id'는 무엇입니까? ddl, 샘플 및 예상 출력을 게시하면 더 좋을 것입니다. –

    답변

    2

    쿼리가 작동하지 않습니다. GROUP BY에 집계로 래핑되지 않은 모든 열을 정의해야합니다.

    그것은 분명하지 않다,하지만 당신은, 독특한 대화의 수를 원하는 경우 사용

    SELECT COUNT(DISTINCT m.conversation_id) AS unread 
        FROM MESSAGES m 
    WHERE m.to_id = ? 
        AND m.readed = 0 
        AND m.hide_from != ? 
    

    ... 그렇지 않으면, 사용 :

    SELECT COUNT(*) AS unread 
        FROM MESSAGES m 
    WHERE m.to_id = ? 
        AND m.readed = 0 
        AND m.hide_from != ? 
    
    • 하위 쿼리가 불필요을
    • ORDER BY은 궁극적 인 출력에서 ​​사용되지 않고 TOP이 사용 중이기 때문에 자원 낭비입니다.
    • 가 열
    +0

    나는 상향 투표했다. 그러나 나는'*'가'DISTINCT id '일 필요가 있을지도 모른다고 그의 질문을 쓴 방식으로 생각하고있다. 그것은 말할 것도 조금 있지만 . – Aaronaught

    +0

    사실 그는 하위 쿼리에서 그 신비한 그룹 때문에 별개의 conversation_id를 원한다고 생각합니다. – Jimmy

    0

    작동 여부 ID가 집계되지 않으므로 대화별로 ID 그룹을 선택할 수 없습니다.

    그런데 읽지 않은 메시지가있는 대화를 찾고 있습니까?

    select count(distinct conversation_id) from message 
    WHERE to_id = ? 
        AND readed = 0 
        and NOT hide_from = ? 
    

    당신이 당신은 order by 절을 필요로하지 않으며, 당신은 내부 하위 쿼리에 group by 절을 이동할 수 있습니다

    0
    SELECT COUNT(*) as unreaded FROM ( 
        SELECT id, conversation_id 
        FROM messages 
        WHERE to_id = ? 
        AND readed = 0 
        and NOT hide_from = ? 
        GROUP BY conversation_id 
    ) as temp_messages2 
    

    을 필요로 무엇을 얻어야한다.

    +0

    작동하지 않습니다.'id' 열에 집계가 없기 때문에'GROUP BY id, conversation_id'가되어야합니다. 결과가 정확할 지 모르지만 쿼리가 MySQL에서 실행되면 작동합니다. –

    관련 문제