2009-08-09 8 views
1

Ich arbeite mit PHP. Ich habe eine Tabelle mit dem Namen Bücher. In der Tabelle Bücher habe ich die book_name mit dem Namen des Buches, book_publisher mit der ID des Verlegers und book_author mit der ID des Autors. Neben der Bücher-Tabelle habe ich die books_author Tabelle mit den Namen und IDs der Autoren und books_publisher mit den Büchern Herausgeber Namen und IDs.MySQL Query basierend auf 3 Tabellen

Ich gebe meine Benutzer 3 Eingabefelder, die den Namen des Autors, Buchname und Verleger Namen und eine Suchtaste darstellt. Sie können einen Autorennamen, einen Buchnamen und einen Verlagsnamen in derselben Suche eingeben und ich muss meine Datenbank abfragen und die Buchnamen mit dem Autorennamen LIKE (% ..%), eingegebenem Autorennamen, Buchnamen wie das eingegebene Buch zurückgeben Name und Herausgebername LIKE der eingegebene Herausgebername.

Das Problem ist, dass ich nur die ID des Autors und Publisher-ID in meiner Bücher-Tabelle gespeichert habe und ich muss nach allen drei Feldern suchen und Dubletten ausschließen (Bücher, die nach Namen und auch nach Herausgeber übereinstimmen).

Kann jemand mir helfen, diese Abfrage bauen?

Antwort

6

verbinden Sie einfach die Abfrage:

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

der Regel in diesen Situationen die Suchfelder sind optional, so dass Sie dynamisch die Abfrage zu erstellen benötigen, um, das heißt die WHERE Klausel nur auf Filter, sagen wir, den Namen des Publishers, wenn Der Benutzer hat tatsächlich einen Herausgebernamen eingegeben.

Auch auf LIKE '%blah%' Suche ist nicht skalierbar über Tausende oder möglicherweise Zehntausende von Datensätzen. Keine Indexierung kann dafür sorgen. Vielleicht möchten Sie stattdessen etwas wie die MySQL full-text searching verwenden.

Schließlich, stellen Sie sicher, dass Sie Ihre Eingabe sanieren, alle Pass dh Ihre Eingabefelder durch mysql_real_escape_string().

+0

+1 für die Volltextsuche Vorschlag – karim79

+0

Noch besser ist die Indizierung der Textfelder mit Sphinx Search. Ich verstehe, es ist viel schneller als MySQL eingebaute Volltext-Indexierung, unterstützt Stemming, etc. –

+0

Vielen Dank! –