在MySQL中使用COUNT时如何返回0而不是null

在MySQL中使用COUNT时如何返回0而不是null,mysql,json,null,count,Mysql,Json,Null,Count,我使用此查询返回存储在$sTable中的歌曲列表,以及存储在$sTable2中的歌曲项目总数 /* * SQL queries * Get data to display */ $sQuery = " SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))." FROM $sTable b LEFT JOIN (

我使用此查询返回存储在$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
一切都没有成功

有什么想法吗?

使用
COALESCE()
函数。
COALESCE()
至少接受2个参数,按顺序计算,并返回第一个非空参数。因此
COALESCE(null,0)
将返回
0
,而
COALESCE(null,null,null,1)
将返回
1

在重新阅读查询时,应该能够获得如下所示的结果:

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
SELECT,b.songsID,COUNT(*)作为项目\u COUNT
从$b开始
左外连接$sTable2 bb ON bb.songs_id=b.songsID
$sWhere
b.songsID分组
$sOrder
$sLimit

就像我说的,这应该是可行的,但它的某些方面感觉不太正确。

COALESCE()
返回第一个非空参数。因此,如果你说
COALESCE(count(…),0)
它将返回
count(…)
如果它不是空的,或者如果
count(…)它将返回0
为null

您不必使用子查询进行连接。如果没有合并等,以下操作应该可以正常工作:

SELECT blahblahblah, IFNULL(bb.projects_count, 0)
FROM $sTable b
etc...
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))."
这将返回您在项目中要求的内容

它的工作方式是:
左连接
只是确保您获得所有数据。 不能使用
COUNT
,因为这将为空行返回
1
。 但是,如果只使用布尔值TRUE的计算结果为1和
布尔值FALSE的计算结果为0,您可以对这些结果求和。

只需在选择后将这一行添加到代码中即可

如果(projects\u count为空,0,projects\u count)作为projects\u 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());
在MySQL中返回0而不是null
使用

如果从tblUser中选择(年龄为空,0,年龄),则选择id

与具有联接2个表的count()一起使用

结果是

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 

感谢所有回答的人,但是,除了使用COALESCE之外,所有建议似乎都没有给我提供任何东西,包括使用COALESCE。不过,COALESCE对我来说是新的,我不确定在将它与COUNT(*)组合时使用什么样的语法。如果您能详细说明我的代码示例,我将非常感激,因为我的尝试似乎仍然会导致“null”。谢谢!遗憾的是,尽管我非常感谢您的努力,但它仍然没有。尽管我非常讨厌,但我可能不得不暂时使用jquery hack将null值替换为0,直到找到解决方案为止:-(虽然这看起来是一个更好的解决方案,但它不适合我,而且我对MySQL的经验不足,使我无法调整您的示例代码,使其与我的其他部分正常工作。我已更新了我的问题,以提供更多细节。非常感谢您的建议,但我认为我们肯定正在接近。您介意打印res吗我的查询结果和粘贴结果?它会在我的应用程序中为我返回一个JSON格式错误。我不确定实际查询结果会有多有用,但它们是:。str_replace(;“introde(;”$aColumns))。;“5059”如果这不是在我真诚地道歉之后你所做的,正如我所说的,我对MySQL和调试查询的方法非常陌生。如果有帮助的话,我可以粘贴整个PHP文件(没有那么长)我用来执行查询并返回JSON?为了澄清上述问题,您的查询只返回1个结果,而我原来的查询返回所有5000个条目。
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