【问题标题】:MySQL query based on 3 tables基于 3 个表的 MySQL 查询
【发布时间】:2009-08-09 14:45:20
【问题描述】:

我使用 PHP。我有一张名为书的桌子。在表格书籍中,book_name 带有书名,book_publisher 带有出版商 ID,book_author 带有作者 ID。除了 books 表之外,我还有带有作者姓名和 ID 的 books_author 表和带有书籍出版商名称和 ID 的 books_publisher

我为我的用户提供了 3 个输入字段,分别代表作者姓名、书名和出版商名称以及一个搜索按钮。他们可以在同一个搜索中输入作者姓名、书名和出版商姓名,我必须查询我的数据库并返回作者姓名 LIKE (%..%) 输入作者姓名的书名,书名 LIKE 输入的书名称和出版商名称 LIKE 输入的出版商名称。

问题是我在书表中只存储了作者的 ID 和出版商的 ID,我需要按所有三个字段搜索并排除重复项(按名称和出版商匹配的书籍)。

谁能帮我建立这个查询?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    只需加入查询:

    SELECT *
    FROM books b
    JOIN book_authors ba ON b.author_id = ba.id
    JOIN book_publishers bp ON b.publisher_id = bp.id
    WHERE b.book_name LIKE '...'
    AND ba.author_name LIKE '...'
    AND bp.publisher_name LIKE '...'
    

    通常在这些情况下,搜索框是可选的,因此您需要动态构建查询,这意味着 WHERE 子句仅在用户实际输入出版商名称时过滤出版商名称。

    此外,在 LIKE '%blah%' 上的搜索无法扩展到超过数千或可能数万条记录。没有索引可以满足这一点。您可能想考虑改用 MySQL full-text searching 之类的东西。

    最后,确保清理输入,这意味着通过 mysql_real_escape_string() 传递所有输入字段。

    【讨论】:

    • 更好的是使用 Sphinx Search 索引文本字段。我知道它比 MySQL 的内置全文索引快很多,支持词干提取等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2023-02-08
    • 2023-03-21
    • 2011-05-09
    相关资源
    最近更新 更多