2009-08-09 7 views
1

Je travaille avec PHP. J'ai une table nommée livres. Dans les livres de table j'ai le book_name avec le nom du livre, book_publisher avec l'ID de l'éditeur et book_author avec l'ID de l'auteur. Outre la table des livres, j'ai le tableau books_author avec les noms des auteurs et les ID et books_publisher avec les noms des éditeurs de livres et les ID.Requête MySQL basée sur 3 tables

Je donne à mes utilisateurs trois champs de saisie qui représentent le nom de l'auteur, le nom du livre et le nom de l'éditeur, ainsi qu'un bouton de recherche. Ils peuvent entrer un nom d'auteur, un nom de livre et un nom d'éditeur dans la même recherche et je dois interroger ma base de données et retourner les noms de livres ayant le nom d'auteur LIKE (% ..%) nom et nom de l'éditeur AIMER le nom de l'éditeur entré. Le problème est que je n'ai stocké que l'ID de l'auteur et l'identifiant de l'éditeur dans ma table des livres et que j'ai besoin de chercher dans les trois champs et d'exclure les doublons (livres qui correspondent par nom et par éditeur).

Quelqu'un peut-il m'aider à construire cette requête?

Répondre

6

Il suffit de se joindre à la requête:

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

Habituellement, dans ces situations, les champs de recherche sont en option vous aurez donc besoin de construire dynamiquement la requête, ce qui signifie la clause WHERE pour filtrer uniquement, par exemple, le nom de l'éditeur si l'utilisateur a effectivement entré un nom d'éditeur.

En outre, la recherche sur LIKE '%blah%' n'est pas extensible au-delà de milliers ou peut-être de dizaines de milliers d'enregistrements. Aucune indexation ne peut répondre à cela. Vous pouvez vouloir utiliser quelque chose comme le MySQL full-text searching à la place. Enfin, assurez-vous de désinfecter votre entrée, c'est-à-dire de passer tous vos champs de saisie à mysql_real_escape_string().

+0

+1 pour la suggestion de recherche de texte intégral – karim79

+0

Encore mieux est l'indexation des champs de texte avec Sphinx Search. Je comprends que c'est beaucoup plus rapide que l'indexation de texte intégral de MySQL, supporte le stemming, etc. –

+0

MERCI BEAUCOUP! –

Questions connexes