【问题标题】:Help with a MySQL query帮助 MySQL 查询
【发布时间】:2011-07-19 02:20:09
【问题描述】:

鉴于以下表格,我想知道如何编写查询以仅返回包含书籍的类别以及每个类别的书籍数量。一本书可以添加到一个或多个类别中。我正在使用 PHP 和 MySQL。

这是我的桌子:

类别表
- 身份证
- 名称
- 永久链接

书桌
- 身份证
- 标题
- 作者
- 描述
- 价格

books_categories 表
- 身份证
- book_id
- category_id

【问题讨论】:

    标签: php mysql


    【解决方案1】:
    SELECT categories.id, 
        COUNT(books_categories.id) AS number
    FROM categories
        LEFT JOIN books_categories ON books_categories.category_id = categories.id
    GROUP BY categories.id
    HAVING number > 0;
    

    【讨论】:

      【解决方案2】:
      select c.id
            ,c.name
            ,count(*) as num_books
        from categories c
        join books_categories bc on(bc.category_id = c.id)
       group 
          by c.id
            ,c.name;
      

      如果您还想要没有书籍的类别,请使用LEFT JOIN

      【讨论】:

      • 我认为对 SQL 部分使用大写字母会使查询的可读性大大提高。我允许自己编辑它。
      • 大写关键字在我们获得彩色屏幕和语法高亮的那一刻就变得无用和浪费。我回滚到我自己的个人品味。
      • 我不会发起回滚战,但我不同意你的观点。在 PHP 世界中,查询经常放在引号之间,这将禁用着色优势。
      【解决方案3】:
      SELECT *, COUNT(*) AS count
      FROM books_categories AS bc
      LEFT JOIN categories AS c ON c.id = bc.category_id
      GROUP BY c.id
      

      您将获得一个 count 列,其中包含每个类别的行数。书籍为零的类别(即表 books_categories 中没有条目的类别)将不会返回。

      【讨论】:

      • 我认为您将表格的顺序错误(或者您的意思是正确的连接)。
      • @Ronnis,我不这么认为。我使用这样的查询,它们工作正常。只要我只想获得分配了一些书籍的类别,就可以了。
      • 您的查询与您的描述不符。书籍为零的类别不会包含在您的结果中。要解决此问题,您需要使用 RIGHT JOIN(如果 mysql 支持)或更改表的顺序。事实上,除非缺少 RI 约束和垃圾数据,否则您的查询与内部联接相同。
      猜你喜欢
      • 2011-11-07
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多