2009-08-09 105 views
1

我使用PHP工作。我有一張名爲書籍的表格。在表格簿中,我有book_name這本書的名字,book_publisher與發行者的ID和book_author與作者的ID。除書籍表外,我還有books_author表,其中包含作者姓名和ID,books_publisher包含書籍出版商名稱和ID。基於3個表的MySQL查詢

我給我的用戶3個輸入字段,代表作者姓名,書名和出版商名稱以及搜索按鈕。他們可以在同一個搜索中輸入作者姓名,圖書名稱和出版商名稱,我必須查詢我的數據庫並返回具有作者姓名LIKE(%..%)的書籍名稱輸入的作者姓名,書名LIKE輸入的書籍名稱和發佈者名稱LIKE輸入的發佈者名稱。

問題是,我在書籍表中只存儲了作者的ID和發佈者ID,我需要按這三個字段進行搜索並排除重複項(名稱和發佈者匹配的書籍)。

任何人都可以幫我建立這個查詢嗎?

回答

6

剛剛加入查詢:

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()

+0

+1全文搜索建議 – karim79 2009-08-09 15:05:24

+0

更好的是用Sphinx搜索索引文本字段。我知道它比MySQL內置的全文索引快得多,支持詞幹等。 – 2009-08-09 15:59:44

+0

非常感謝! – 2009-08-09 17:53:23