【问题标题】:need help with mysql for book system - problem with where clause需要有关书籍系统的 mysql 帮助 - where 子句的问题
【发布时间】:2011-03-08 08:11:19
【问题描述】:

大家好,我正在为出版商开发新项目......这个开发系统项目保存了该出版商的所有书籍...... 我们有 3 张桌子 图书 作者 合著者

问题案例: ieach book 有 1 个主要作者,该作者可以在很多书籍中重播,并且 ieach book 在某些情况下可能有共同作者此共同作者可能是 1 或 2 或 3 或 12 注意:此共同作者已保存在作者表中

现实主义: 作者和书籍之间的一对多

合著者与书籍和作者之间的多对多

table #1 authors 表 => 表包含所有作者 id - 作者姓名

table #2 books table => table 存放所有书籍 id-title-author_id-publishing_year

table #3 co_authors table => 保存所有有很多共同作者的项目 item_id 和 authors_id

如果他是主要作者或共同作者,我现在如何检索特定作者的所有书籍

【问题讨论】:

  • co_authors.item_id 映射到 books.book_id?

标签: sql


【解决方案1】:

有两种方法可以解决这个问题...一种是使用UNION,例如:

SELECT id FROM books WHERE author_id = ?
UNION ALL
SELECT item_id FROM co_authors WHERE authors_id = ?

您可以解决此问题的另一种方法是重新设计您的数据库结构,以便在 books 表中没有 author_id,而是在 co_authors 中有一个名为 main_author 或类似的标志。考虑到您可能有一些不清楚主要作者是谁的书,这可能更有意义...

【讨论】:

  • 你也可以用左连接来做到这一点
  • @Krtek,假设您也想要主要作者。否则,您的结果集中会有额外的信息。此外,如果您不小心,您最终会在相关作者是主要作者的书籍的每个共同作者中出现一行。
  • @jswolf19 看看我的查询,它没有你提到的任何问题。
  • @Krtek,实际上,根据您的查询,如果所讨论的作者是具有多个共同作者的书的主要作者,那么,是的,将为每个共同作者返回一行这本书。
  • @jswolf19 不,where子句只会选择给定作者id的行,你可以试试;)
【解决方案2】:

你可以这样做:

SELECT DISTINCT books.*, authors.*
FROM books
LEFT JOIN co_authors ON co_authors.item_id = books.id
INNER JOIN authors ON 
        authors.id = books.author_id OR 
        authors.id = co_authors.author_id
WHERE authors.id = ID

where 子句也可以写成 authors.name = 'NAME' 如果您需要按名称而不是 id 搜索。

编辑:添加 distinct 以避免同一本书出现多行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多