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

时间:2011-11-01 18:10:41

标签: mysql json null count

我使用此查询返回返回存储在$ sTable中的歌曲列表以及存储在$ sTable2中的总项目的COUNT。

 /*
     * 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

一切都没有成功。

有什么想法吗?

5 个答案:

答案 0 :(得分:5)

使用COALESCE()功能。 COALESCE()至少需要2个参数,按顺序计算,并返回第一个非null参数。因此COALESCE(null, 0)将返回0COALESCE(null, null, null, null, 1)将返回1。这是关于COALESCE()的{​​{3}}。

在重新阅读您的查询时,您应该能够获得您想要的结果:

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 :(得分:1)

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

答案 2 :(得分:1)

您不必使用子查询进行连接。如果没有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,因为这会为NULL行返回1。 但是,如果你只是使用布尔值TRUE求值为1和a的事实 boolean FALSE的计算结果为0,你可以SUM对这些结果进行评估。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

只需在SELECT之后将这一行添加到您的代码中

  

IF(projects_count IS NULL,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());

在MySQL中返回0而不是null
使用

  

SELECT id,IF(age IS NULL,0,age)from 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