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

#mysql #json #null #count

#mysql #json #null #граф

Вопрос:

Я использую этот запрос для возврата списка песен, хранящихся в $sTable, вместе с КОЛИЧЕСТВОМ их общих проектов, которые хранятся в $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
 

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

Есть идеи?

Ответ №1:

Используйте 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. Спасибо всем, кто ответил, однако ни одно из предложений, похоже, не дает мне ничего, кроме «null», включая использование COALESCE. Тем не менее, COALESCE является для меня новым, и я не уверен в подходящем синтаксисе для использования при объединении его с COUNT(*) . Если бы вы могли, возможно, уточнить мой пример кода, я был бы очень благодарен, поскольку мои попытки, похоже, все еще приводят к ‘null’. Спасибо!

2. К сожалению, это все еще не так, хотя я действительно ценю усилия. Как бы я этого ни ненавидел, мне, возможно, придется временно использовать jquery для замены нулевых значений на 0, пока я не найду решение. 🙁

Ответ №2:

COALESCE() возвращает первый ненулевой аргумент. Итак, если вы скажете COALESCE(count(...),0) , что он вернет count(...) значение if, если оно не равно null, или вернет 0, если значение count(...) равно null

Ответ №3:

Вам не нужно выполнять соединение с помощью подзапроса. Следующее должно работать нормально без объединения и т. Д:

 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 just гарантирует, что вы получите все данные. Вы не можете использовать COUNT , потому что это вернет 1 нулевые строки. Но, если вы просто используете тот факт, что логическое значение TRUE равно 1, а логическое значение FALSE равно 0, вы можете SUM переопределить эти результаты.

Комментарии:

1. Хотя это выглядит как гораздо лучшее решение, оно не работает для меня, и моя неопытность в MySQL не позволяет мне адаптировать ваш пример кода для правильной работы с остальной частью моего. Я обновил свой вопрос, чтобы дать более подробную информацию. Огромное спасибо за предложение, хотя, я думаю, мы, безусловно, приближаемся.

2. Не могли бы вы распечатать результат моего запроса и вставить его?

3. Для меня это возвращает ошибку форматирования JSON… в моем приложении. Я не уверен, насколько полезными будут фактические результаты запроса, но они есть: .str_replace(;» implode(«;» $ aColumns)).»;»5059″ Если это не то, что вы искали, я искренне извиняюсь, как уже говорилось, я новичок в MySQL и методах вкакой из них будет отлаживать запросы. Если бы это помогло, я мог бы вставить весь PHP-файл (он не такой длинный), который я использую для выполнения запросов и возврата JSON?

4. Чтобы прояснить вышесказанное, ваш запрос возвращает только 1 результат. В то время как мой оригинальный возвращает все 5000 записей.

Ответ №4:

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

Ответ №5:

Просто добавьте эту строку в свой код после ВЫБОРА

IF(projects_count РАВНО НУЛЮ, 0, projects_count) Как projects_countList

Вот так:

 $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
ИСПОЛЬЗОВАНИЕ

ВЫБЕРИТЕ идентификатор, ЕСЛИ (возраст РАВЕН НУЛЮ, 0, возраст) ИЗ tblUser

ИСПОЛЬЗУЙТЕ с count(), объединив 2 таблицы
, например

 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