Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: gordyrОтветов: 4

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

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

Любые идеи?

jsonnullcount

Ответы

Ответ 1 · рейтинг 5 · Crontab

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

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

Ответ 2 · рейтинг 1 · Дамян Станчев

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

Ответ 3 · рейтинг 1 · Eljakim

Вам не нужно выполнять соединение с подзапросом. Следующее должно работать нормально без 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 перебрать эти результаты.

Ответ 4 · HSP

Просто добавьте эту строку в свой код после 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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы