【问题标题】:MySQL: get records from database and add a COUNT() column to the rowsMySQL:从数据库中获取记录并将 COUNT() 列添加到行中
【发布时间】:2009-12-07 12:48:33
【问题描述】:

我正在尝试从一个表中检索书籍并离开加入章节表。我从第二个表中需要的只是这些书籍可用章节的 COUNT() 并将该值添加为称为章节(或其他内容)的额外列。

我目前的尝试如下所示: SELECT b.*, count(c.chapter_nr) as chapters FROM books as b left join chapter as c on c.book_id = b.id

这仅从 books 表中获取一个并将 count() 结果添加到该行,但我想从 books 表中获取所有行,因此是 LEFT JOIN

【问题讨论】:

    标签: mysql join count


    【解决方案1】:
    SELECT b.*, count(c.chapter_nr) as chapters 
    FROM books as b 
    LEFT JOIN chapters as c on (c.book_id = b.id)
    GROUP BY b.id
    

    解释

    您需要按书籍分组以确定实际的章节数。如果您要省略 GROUP BY 子句,您将检索每本书所有章节的结果集。您只是想将结果限制为唯一的书籍及其相应的章节数。

    【讨论】:

      【解决方案2】:

      您缺少 GROUP BY 子句:

      SELECT b.*, count(c.chapter_nr) as chapters 
      FROM books AS b 
      LEFT JOIN chapters AS c ON c.book_id = b.id 
      GROUP BY b.id
      

      【讨论】:

        【解决方案3】:

        试试:

        SELECT b.*,  
        (select count(*) from chapters c where c.book_id = b.id) as chapters   
        FROM books b
        

        如果一本书没有章节,这将返回 0。

        【讨论】:

        • 左外连接方法的问题在于,即使没有章节行,它们也会倾向于返回最小计数 1
        • 使用左外连接方法,只要计算章节的不可空属性(如chapter_nr),对于没有章节的书,您将得到计数为0。跨度>
        【解决方案4】:

        未经测试,但你需要一个“分组依据”子句来做你想做的事:

        Select b.*, count(*) as chapters
        from books b left outer join chapters c
        on c.book_id = b.id
        group by b.*
        

        【讨论】:

        • 这将返回 1 作为没有章节的书籍的章节数。将count(*) 更改为count(c.chapter_nr) 以计算章节数(具有非空chapter_nr 的行)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-12
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多