Php 基于3个表的MySQL查询

Php 基于3个表的MySQL查询,php,mysql,Php,Mysql,我使用PHP。我有一张书桌。在table books中,我有书名和书名,book\u publisher带有出版商ID和book\u author带有作者ID。除了books表之外,我还有books\u author表带有作者姓名和ID,还有books\u publisher带有图书出版商姓名和ID 我给我的用户提供了3个输入字段,分别代表作者姓名、书名和出版商姓名,还有一个搜索按钮。他们可以在同一搜索中输入作者姓名、书名和出版商姓名,我必须查询我的数据库,并返回具有作者姓名(如(%..)输入的

我使用PHP。我有一张书桌。在table books中,我有
书名
和书名,
book\u publisher
带有出版商ID和
book\u author
带有作者ID。除了books表之外,我还有
books\u author
表带有作者姓名和ID,还有
books\u publisher
带有图书出版商姓名和ID

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

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

有人能帮我建立这个查询吗?

只要加入查询:

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
子句仅在用户实际输入发布者名称时过滤,例如,发布者名称

此外,像“%blah%”这样的
搜索不可扩展到超过数千条或可能数万条记录。没有索引可以满足这一需求。您可能需要考虑使用类似的方法

最后,请确保您对输入进行了清理,这意味着要通过所有输入字段。

只需加入查询:

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
子句仅在用户实际输入发布者名称时过滤,例如,发布者名称

此外,像“%blah%”这样的
搜索不可扩展到超过数千条或可能数万条记录。没有索引可以满足这一需求。您可能需要考虑使用类似的方法


最后,请确保对输入进行清理,这意味着将所有输入字段都传递出去。

更好的方法是使用Sphinx搜索为文本字段编制索引。我知道它比MySQL内置的全文索引快得多,支持词干分析等。使用Sphinx搜索对文本字段进行索引更好。我知道它比MySQL内置的全文索引、支持词干分析等要快得多。