2011-11-01 2 views
0

이 쿼리를 사용하여 $ sTable에 저장된 노래의 목록과 $ sTable2에 저장된 총 프로젝트 수를 반환합니다.MySQL에서 COUNT를 사용할 때 null 대신 null을 반환하는 방법

/* 
    * SQL queries 
    * Get data to display 
    */ 
    $sQuery = " 
     SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))." 

    FROM $sTable b 
    LEFT JOIN (
    SELECT COUNT(*) AS projects_count, a.songs_id 

    FROM $sTable2 a 
    GROUP BY a.songs_id 
) bb ON bb.songs_id = b.songsID 


     $sWhere 
     $sOrder 
     $sLimit 
    "; 
    $rResult = mysql_query($sQuery, $gaSql['link']) or die(mysql_error()); 

'projects_count가'$ 안정 '의 열을 따라 배열에 넣고,이 JSON 통하여 스팻 페이지에 다음 표에 표시된다.

노래에 연결된 프로젝트가없는 경우와 완전히 별개입니다. 그것은 물론 NULL을 반환합니다.

원하는 모든 값은 '0'으로 반환됩니다.

나는 COUNT()를 시도

, COUNT (IFNULL (PROJECT_ID, 0)) (DISTINCT COUNT를 사용하여 ...

또한 : -

SELECT COALESCE(COUNT(*),0) AS projects_count, a.songs_id 

모든 성공없이

.

어떤 아이디어?

답변

5

COALESCE() 기능을 사용합니다. COALESCE() 순서대로 계산 2 개 이상의 인수를 받아, 첫 번째 null이 아닌 인수를 반환합니다. 그래서 COALESCE(null, 0)0을, COALESCE(null, null, null, null, 1)1을 반환합니다. 여기에 MySQL's documentationCOALESCE()입니다. 에서

다시 읽기 쿼리를, 당신 결과이 같이 원하는 얻을 수 있어야합니다 : 내가 말했듯이

SELECT <all the fields you want>, b.songsID, COUNT(*) AS projects_count 
FROM $sTable b 
LEFT OUTER JOIN $sTable2 bb ON bb.songs_id = b.songsID 
$sWhere 
GROUP BY b.songsID 
$sOrder 
$sLimit 

, 이것은 작동해야하지만 그것에 대해 뭔가 아주 기분하지 않습니다 권리.

+0

답장을 보내 주신 모든 분들께 감사드립니다. 그러나 제안 사항 중 어느 것도 COALESCE 사용을 포함하여 'null'이외의 다른 것을 제공하지 않는 것 같습니다. 그러나 COALESCE는 새로운 것이고 COUNT (*)와 결합 할 때 사용할 적절한 구문이 불확실합니다. 내 코드 예제로 좀 더 자세히 설명 할 수 있다면 내 시도가 여전히 'null'로 나타나는 것처럼 가장 감사 할 것입니다. 감사! – gordyr

+0

제 편집을 시도하고 작동하는지 확인하십시오. – Crontab

+0

슬프게도 나는 아직도 그 노력에 감사하지만, 아직하지 않습니다. 내가 싫어하는 한, 솔루션을 찾을 때까지 jquery hack을 임시로 넣어 null 값을 0으로 대체해야 할 수도 있습니다. :-( – gordyr

0
SELECT blahblahblah, IFNULL(bb.projects_count, 0) 
FROM $sTable b 
etc... 
1

COALESCE()은 첫 번째 null이 아닌 인수를 반환합니다. 따라서 COALESCE(count(...),0)이라면 null이 아니면 count(...)을 반환하거나 count(...)이 null이면 0을 반환합니다.

0

하위 쿼리와 조인 할 필요가 없습니다. 다음은 COALESCE 등이 없으면 정상적으로 작동합니다.

SELECT ".str_replace(" , ", " ", implode(", ", $aColumns)).", 
SUM(b.songsID is not null) as countprojects 
FROM $sTable b 
LEFT JOIN $sTable2 a ON a.songs_id=b.songsID 
GROUP BY ".str_replace(" , ", " ", implode(", ", $aColumns))." 

이렇게하면 countprojects에서 요청한 것을 반환합니다.

작동 방식 : LEFT JOIN을 사용하면 모든 데이터를 가져올 수 있습니다. NULL 행에 대해 1을 반환하므로 COUNT을 사용할 수 없습니다. 그러나 부울 TRUE가 1로 평가되고 부울 FALSE가 0으로 평가된다는 사실을 사용하는 경우 해당 결과에 대해 SUM을 사용할 수 있습니다.

+0

이것은 훨씬 더 나은 해결책 인 것처럼 보이지만, MySQL에 익숙하지 않아 내 나머지 부분과 제대로 작동하도록 예제 코드를 수정할 수 없다. 세부 사항. 제안에 큰 감사드립니다. 우리가 확실히 가까이에있는 것 같아요. – gordyr

+0

내 쿼리 결과를 인쇄하여 붙여 넣으시겠습니까? – Eljakim

+0

내 응용 프로그램 내에서 JSON 형식 오류가 발생했습니다. 실제 쿼리 결과가 얼마나 유용한 지 모르지만 실제로는 다음과 같습니다. .str_replace (; "\t \t implode ("\t $ aColumns)). ";"5059 "\t 내가 진심으로 사과, 나는 매우 MySQL과 쿼리를 디버깅하는 방법에 새로운 있습니다. 만약 내가 전체 PHP 파일을 붙여 넣을 수 도움이 될 (그것은 오래 걸리지 않습니다.) 쿼리를 수행하고 JSON을 반환하는 데 사용하고 있습니까? – gordyr

관련 문제