2009-08-09 24 views
1

私はPHPで動作します。私は本と呼ばれるテーブルを持っています。テーブルの書籍では、書籍の名前をbook_name、投稿者IDがbook_publisher、投稿者IDがbook_authorです。書籍の表に加えて、著者の名前とIDを持つbooks_authorテーブルと書籍の出版社の名前とIDを持つbooks_publisherテーブルがあります。3つのテーブルに基づくMySQLクエリ

私は、著者名、書籍名、出版社名、および検索ボタンを表す3つの入力フィールドをユーザーに提供します。同じ検索で著者名、書籍名、出版社名を入力することができます。データベースを照会し、著者名LIKE(%..%)入力された著者名、書籍名LIKEなどの書籍名を返す必要があります名前および発行者名LIKE入力された発行者名。

問題は、書籍のテーブルに著者のIDと出版社のIDのみを格納していて、3つのフィールドすべてを検索して重複を除外する必要があるということです(名前と出版社によって一致する書籍)。

誰でもこのクエリの作成を手伝ってもらえますか?場合にのみ、たとえば、発行者名を上のフィルタにWHERE句を意味し、あなたが動的にクエリを構築する必要がありますので、検索ボックスがオプションであるこのような状況では通常

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 '...' 

答えて

6

ただ、クエリに参加ユーザーは実際にサイト運営者名を入力しました。

また、LIKE '%blah%'の検索は、何千もの、おそらくは数万のレコードを超えてスケ​​ーラブルではありません。索引付けはそれに対応できません。あなたは代わりにMySQL full-text searchingのようなものを使用して調べることができます。

最後に、あなたの入力フィールドがすべてmysql_real_escape_string()に渡されていることを確認して入力を害さないようにしてください。

+0

+1全文検索の提案 – karim79

+0

スフィンクスの検索では、テキストフィールドのインデックスを作成することがさらに優れています。 MySQLの組み込み全文索引付けよりもはるかに高速で、ステミングなどをサポートしています。 –

+0

本当にありがとうございます! –

関連する問題