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