MySQL 쿼리에서 IF 조건으로 계산


115

두 개의 테이블이 있는데 하나는 뉴스 용이고 다른 하나는 댓글 용이며 상태가 승인 됨으로 설정된 댓글 수를 가져오고 싶습니다.

SELECT
    ccc_news . *, 
    count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments
FROM
    ccc_news
    LEFT JOIN
        ccc_news_comments
    ON ccc_news_comments.news_id = ccc_news.news_id
WHERE
    `ccc_news`.`category` = 'news_layer2'
    AND `ccc_news`.`status` = 'Active'
GROUP BY
    ccc_news.news_id
ORDER BY
    ccc_news.set_order ASC
LIMIT 20 

그러나이 쿼리의 문제점은 해당 뉴스에 해당하는 댓글이 있는지 여부에 관계없이 댓글 열에 대해 가져 오는 최소값이 1이라는 것입니다.

어떤 도움이라도 대단히 감사하겠습니다.


5
COUNT 대신 SUM을 사용하면 어떻게됩니까?
존 선택

답변:


265

sum()대신 사용count()

아래에서 시도하십시오.

SELECT
    ccc_news . * , 
    SUM(if(ccc_news_comments.id = 'approved', 1, 0)) AS comments
FROM
    ccc_news
    LEFT JOIN
        ccc_news_comments
    ON
        ccc_news_comments.news_id = ccc_news.news_id
WHERE
    `ccc_news`.`category` = 'news_layer2'
    AND `ccc_news`.`status` = 'Active'
GROUP BY
    ccc_news.news_id
ORDER BY
    ccc_news.set_order ASC
LIMIT 20 

11
또는 MySQL 전용 트릭 인 SUM (ccc_news_comments.id = 'approved')도 있습니다
mojuba

1
@mojuba는 100 % 동일 하지 않습니다. (조건 없음)이 반환 null되었을 때 트릭 COUNT이 반환 0됩니다. 시는 COUNT아무것도 반환 한 것이라고 하지만, 0,하지만은 SUM 않습니다 반환 0, 당신의 트릭 돌아갑니다 0.
Robin Kanters 2013

@mojuba 케이스와 포인트 . num_relevant_partsis SUMwith condition, num_total_partsis COUNT(parts.id)(이중 코멘트 죄송합니다. 편집하기에는 너무 늦었습니다)
Robin

68

더 나은 (또는 어쨌든 더 짧음) :

SUM(ccc_news_comments.id = 'approved')

이것은 MySQL의 부울 유형이 C에서 INT 0와 같이 및 로 표시되기 때문에 작동합니다 1. (하지만 DB 시스템간에 이식 할 수는 없습니다.)

에 관해서는 COALESCE()다른 답변에서 언급 한 바와 같이, 많은 언어 API는 자동으로 변환 NULL''값을 가져올 때. 예를 들어 PHP의 mysqli인터페이스를 사용하면 COALESCE().


3
이것은 훨씬 더 읽기 쉬운 SQL 코드를 만듭니다. 아름다운 솔루션.
Dag Sondre Hansen

22

이것은 작동합니다.

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL))

count()값이 존재하는지 여부 만 확인하십시오. 0은 존재하는 값과 동일하므로 하나 더 세고 NULL은 존재하지 않는 값과 같으므로 계산되지 않습니다.


이 경우 count보다 직관적 이라고 생각 sum합니다.
Jeffery

4

다음 줄을 바꿉니다.

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments

이것으로 :

coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments

count (if (ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) ??? 당신이 ccc_news_comments.id를 사용하는 경우 어떤 합을 사용하는 것을 의미한다

죄송합니다. 무슨 말입니까? 부울 값은 0이되거나 한 후 합산 한 경우 0 일부 널 값 병합가
MOSTY Mostacho

@MostyMostacho, COALESCE합계를 반환합니까? MySQL 문서의 모든 참조?
Istiaque Ahmed 2011

네, 왜 안 되겠습니까? 워드 프로세서에 많은 참조가 있습니다 dev.mysql.com/doc/refman/5.7/en/...
MOSTY Mostacho
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.