Как вернуть 0 вместо нуля при использовании COUNT в MySQL - PullRequest
0 голосов
/ 01 ноября 2011

Я использую этот запрос, чтобы вернуть список песен, хранящихся в $ sTable, вместе с COUNT их общих проектов, которые хранятся в $ sTable2.

 /*
     * 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' помещается в массив вместе со столбцами в $ sTable, затем он выводится через JSON и отображается в таблице на странице.

Это прекрасно работает, если песня не имеет проектов, связанных с ней. Это, конечно, возвращает NULL.

Все, что я хочу, это чтобы любые нулевые значения возвращались как '0'.

Я пробовал COUNT (), COUNT (IFNULL (project_id, 0) и использую COUNT (DISTINCT) ...

А также: -

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

Все безуспешно.

Есть идеи?

Ответы [ 4 ]

5 голосов
/ 01 ноября 2011

Используйте функцию COALESCE().COALESCE() принимает не менее 2 аргументов, рассчитанных по порядку, и возвращает первый ненулевой аргумент.Таким образом, COALESCE(null, 0) вернет 0, а COALESCE(null, null, null, null, 1) вернет 1.Вот документация MySQL о COALESCE().

Перечитывая ваш запрос, вы должны иметь возможность получить результаты, которые вы хотите получить следующим образом:

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

Как я уже сказал, это должно сработать, но что-то в этом не так.

1 голос
/ 01 ноября 2011

Вам не нужно выполнять объединение с подзапросом. Следующее должно работать нормально без 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 просто гарантирует, что вы получите все данные. Вы не можете использовать COUNT, потому что это вернет 1 для строк NULL. Но, если вы просто используете тот факт, что логическое значение ИСТИНА оценивается как 1, а логическое значение FALSE оценивается как 0, вы можете SUM превысить эти результаты.

1 голос
/ 01 ноября 2011

COALESCE() возвращает первый ненулевой аргумент.Поэтому, если вы скажете COALESCE(count(...),0), он вернет count(...), если он не равен нулю, или вернет 0, если count(...) равен нулю

0 голосов
/ 01 ноября 2011
SELECT blahblahblah, IFNULL(bb.projects_count, 0)
FROM $sTable b
etc...
...