#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