【问题标题】:How to return 0 instead of null when using COUNT in MySQL在 MySQL 中使用 COUNT 时如何返回 0 而不是 null
【发布时间】:2011-12-19 17:26:50
【问题描述】:

我正在使用此查询返回存储在 $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

都没有成功。

有什么想法吗?

【问题讨论】:

    标签: mysql json null count


    【解决方案1】:

    只需在 SELECT 之后在代码中添加这一行

    IF(projects_count IS NULL, 0, projects_count) As 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() 连接 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 
    

    【讨论】:

      【解决方案2】:

      使用COALESCE() 函数。 COALESCE() 至少接受 2 个参数,按顺序计算,并返回第一个非空参数。所以COALESCE(null, 0) 会返回0COALESCE(null, null, null, null, 1) 会返回1。这是MySQL's documentation 关于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
      

      就像我说的,这应该可以,但是感觉不太对劲。

      【讨论】:

      • 感谢所有回答的人,但似乎没有任何建议给我除了“null”之外的任何东西,包括使用 COALESCE。尽管如此,COALESCE 对我来说是新的,我不确定在将它与 COUNT(*) 组合时使用的适当语法。如果您可以详细说明我的代码示例,我将不胜感激,因为我的尝试似乎仍会导致“null”。谢谢!
      • 遗憾的是它仍然没有,虽然我真的很感激你的努力。尽管我很讨厌,但我可能不得不暂时放置一个 jquery hack 来用 0 替换空值,直到找到解决方案。 :-(
      【解决方案3】:

      您不必使用子查询进行连接。如果没有 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 的事实,并且 boolean FALSE 计算结果为 0,您可以 SUM 覆盖这些结果。

      【讨论】:

      • 虽然这看起来是一个更好的解决方案,但它对我不起作用,而且我对 MySQL 的缺乏经验使我无法调整您的示例代码以与我的其他部分正常工作。我已经更新了我的问题以提供更多详细信息。非常感谢您的建议,我想我们肯定越来越近了。
      • 您介意打印我的查询结果并粘贴吗?
      • 它为我抛出了 JSON 格式错误......在我的应用程序中。我不确定实际查询结果会有多大用处,但它们是: .str_replace(;" implode(";" $aColumns)).";"5059" 如果这不是我真诚道歉后的结果,如说我对 MySQL 和调试查询的方法非常陌生。如果有帮助,我可以粘贴我用来执行查询并返回 JSON 的整个 PHP 文件(它不是那么长)?
      • 为了澄清上述内容,您的查询仅返回 1 个结果。而我原来的返回所有 5000 个条目。
      【解决方案4】:

      COALESCE() 返回第一个非空参数。所以如果你说COALESCE(count(...),0),如果它不为null,它将返回count(...),如果count(...)为null,它将返回0

      【讨论】:

        【解决方案5】:
        SELECT blahblahblah, IFNULL(bb.projects_count, 0)
        FROM $sTable b
        etc...
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-04
          • 1970-01-01
          相关资源
          最近更新 更多