Как вернуть 0 вместо нуля при использовании COUNT в MySQL

Я использую этот запрос, чтобы вернуть список песен, хранящихся в $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

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

Любые идеи?


person gordyr    schedule 01.11.2011    source источник


Ответы (4)


Используйте функцию 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

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

person Crontab    schedule 01.11.2011
comment
Спасибо всем, кто ответил, однако ни одно из предложений, похоже, не дает мне ничего, кроме «нулевого», включая использование COALESCE. Тем не менее, COALESCE является новым для меня, и я не уверен, какой синтаксис использовать при объединении его с COUNT(*). Если бы вы могли уточнить мой пример кода, я был бы очень признателен, поскольку мои попытки, похоже, по-прежнему приводят к «нулю». Спасибо! - person gordyr; 01.11.2011
comment
К сожалению, это все еще не так, хотя я действительно ценю усилия. Как бы я не ненавидел, мне, возможно, придется временно установить хак jquery, чтобы заменить нулевые значения на 0, пока я не найду решение. :-( - person gordyr; 02.11.2011

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

person Дамян Станчев    schedule 01.11.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. Но если вы просто используете тот факт, что логическое значение TRUE оценивается как 1, а логическое значение FALSE оценивается как 0, вы можете SUM перебрать эти результаты.

person Eljakim    schedule 01.11.2011
comment
Хотя это выглядит гораздо лучшим решением, оно не работает для меня, и моя неопытность с MySQL не позволяет мне адаптировать ваш примерный код для правильной работы с остальными моими. Я обновил свой вопрос, чтобы дать более подробную информацию. Тем не менее, огромное спасибо за предложение, я думаю, что мы, безусловно, становимся ближе. - person gordyr; 01.11.2011
comment
Не могли бы вы распечатать результат моего запроса и вставить его? - person Eljakim; 01.11.2011
comment
Он возвращает мне ошибку форматирования JSON... в моем приложении. Я не уверен, насколько полезными будут фактические результаты запроса, но они таковы: для MySQL и методы отладки запросов. Если бы это помогло, я могу вставить весь файл PHP (он не такой длинный), который я использую для выполнения запросов и возврата JSON? - person gordyr; 01.11.2011
comment
Чтобы уточнить вышеизложенное, ваш запрос возвращает только 1 результат. В то время как мой оригинальный возвращает все 5000 записей. - person gordyr; 01.11.2011

Просто добавьте эту строку в свой код после SELECT

ЕСЛИ (счет_проектов равен NULL, 0, количество_проектов) Как список_счет_проектов

Как это:

$sQuery = "
    SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns)).",
     IF(projects_countIS NULL, 0, projects_count) As projects_countList

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());

Чтобы вернуть 0 вместо null в MySQL
USE

ВЫБЕРИТЕ идентификатор, ЕСЛИ (возраст IS NULL, 0, возраст) ОТ tblUser

ИСПОЛЬЗУЙТЕ с count() объединением двух таблиц
как

SELECT 
    tblA.tblA_Id,
    tblA.Name,
    tblC.SongCount,
    IF(tblC.SongCount IS NULL, 0, tblC.SongCount) As noOfSong
  FROM  tblA
    LEFT JOIN
    (   
        SELECT 
            ArtistId,count(*) AS SongCount 
        FROM 
            tblB  
        GROUP BY 
            ArtistId
    ) AS tblC
    ON 
        tblA.tblA_Id = NoOfSong.ArtistId

И Результат

tblA_Id    Name     SongCount   noOfSong
-----------------------------------------------------
7          HSP      NULL        0
6          MANI     NULL        0
5          MEET     1           1
4          user     NULL        0
3          jaani    2           2
2          ammy     NULL        0
1          neha     2           2 
person HSP    schedule 01.11.2019