【问题标题】:As select from table only those books which have exactly 4 of the author?从表中选择只有那些恰好有 4 个作者的书?
【发布时间】:2015-02-27 20:19:52
【问题描述】:

表作者:

id | name_author
---------
1 | david
2 | kate
3 | tom
4 | mark

桌书:

id | name_book
------------
1 | book1
2 | book2
3 | book3

表关系作者和书籍

id_book | id_author
-------------------
1 | 2
1 | 3
1 | 4
2 | 2
1 | 1
3 | 4

因此,我必须得到“Book1”这本书,因为它有 4 个作者(大卫、凯特、汤姆、马克)。

如何向 mysql 写入查询?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    你可以写这样的东西(未测试)

    select name_book
    from books as b
    , link_book_author as l
    where b.id = l.id_book
    group by name_book
    having count(id_author) = 4
    

    【讨论】:

    • 我觉得不错。我个人更喜欢 JOIN 语法,但我不明白为什么这不起作用。
    • 只是一点点 count(distinct(id_author)) 在某些情况下会有所不同:-)
    • 希望作者不要在书皮上出现两次。如果他这样做了,我们就有了“自我爆炸”的情况:)
    • 即便如此,重复的 id_author 和 book_id 也会破坏键约束(如果它们是仅有的两列)。
    【解决方案2】:
    SELECT
        b.name_book, GROUP_CONCAT(a.name_author) authors
    FROM relationships r
    JOIN books b ON r.id_book = b.id
    JOIN author a ON r.id_author = a.id
    GROUP BY r.id_book
    HAVING COUNT(r.id_book) = 4
    ;
    

    【讨论】:

      【解决方案3】:

      就这么简单:

      SELECT COUNT(DISTINCT(id_author)) as authors_num,id_book
      FROM table1
      GROUP BY id_book
      HAVING authors_num=4
      

      如果您需要书名:

      SELECT COUNT(DISTINCT(table1.id_author)) as authors_num,
        table1.id_book, 
        books.name_book
      FROM table1
      LEFT JOIN books
      ON books.id = table1.book_id
      GROUP BY id_book
      HAVING authors_num=4
      

      【讨论】:

        【解决方案4】:

        也许吧:

        SELECT b.name_book, a.name_author
        FROM relationships r
        JOIN books b ON r.id_book = b.id
        JOIN author a ON r.id_author = a.id
        WHERE b.name_book = 'Book1'
        ;
        

        结果:

        +-----------+-------------+
        | name_book | name_author |
        +-----------+-------------+
        | book1     | kate        |
        | book1     | tom         |
        | book1     | mark        |
        | book1     | david       |
        +-----------+-------------+
        4 rows in set (0.00 sec)
        

        或者:

        SELECT b.name_book, GROUP_CONCAT(a.name_author) authors
        FROM relationships r
        JOIN books b ON r.id_book = b.id
        JOIN author a ON r.id_author = a.id
        WHERE b.name_book = 'Book1'
        ;
        

        结果:

        +-----------+---------------------+
        | name_book | authors             |
        +-----------+---------------------+
        | book1     | kate,tom,mark,david |
        +-----------+---------------------+
        1 row in set (0.00 sec)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多