2009-01-24 7 views
6

J'ai actuellement deux tableaux suivants:Recherche deux tables

CREATE TABLE files_list 
(
    'listid' INT, 
    'name' VARCHAR(25), 
    'synonym' VARCHAR(25), 
    'description' VARCHAR(25) 
); 

CREATE TABLE files_tags 
(
    'tag_name' VARCHAR(25), 
    'listid' INT 
); 

Si quelqu'un utilise le mot-clé "dragon ball", en ce moment, j'utilise requête suivante pour rechercher my_list des correspondances possibles:

SELECT * 
FROM files_list 
WHERE name LIKE '%dragon%' 
OR synonym LIKE '%dragon%' 
OR description LIKE '%dragon%' 
OR name LIKE '%ball%' 
OR synonym LIKE '%ball%' 
OR description LIKE '%ball%' 

Je ne suis pas sûr comment rechercher les deux tables en utilisant une requête. Je veux montrer à l'utilisateur les données suivantes dans le résultat de la recherche: nom, synonyme, description et tous les tags.

Mes questions 1. Y a-t-il un moyen de rendre la requête mysql actuelle plus courte? 2. Comment puis-je combiner avec table files_tags, - montrer les lignes de files_list qui a un match à files_tags, mais pas dans files_list? - pour afficher les lignes de files_list qui a une correspondance dans files_list, but may not in files_tags`?

Vous pouvez voir le résultat affiché en cours à http://hsbsitez.com/

+0

http://stackoverflow.com/questions/394041/mysql-how-to-search-multiple-tables-for-a-string-existing-in-any-column Voir cette question votre réponse est là :) – fmsf

+0

Possible duplicate de [MySQL: Comment rechercher plusieurs tables pour une chaîne existant dans une colonne] (http://stackoverflow.com/questions/394041/mysql-how-to-search-multiple-tables-for-a-string-existing-in-any-column) – KindaTechy

Répondre

0

Soyez prudent lorsque vous utilisez l'union pour obtenir effectivement les colonnes que vous voulez pour chaque requête filles fusionnées. Et ce cas, une sous-requête semble plus logique:

SELECT name, synonym, description FROM files_list WHERE 
     name LIKE '%dragon%' OR synonym LIKE '%dragon%' OR description LIKE '%dragon%' 
     OR name LIKE '%ball%' OR synonym LIKE '%ball%' OR description LIKE '%ball%' 
     OR listid IN (SELECT listid FROM files_tags WHERE tag_name='dragon' OR tag_name='ball'); 

Quelques questions supplémentaires: Lorsque vous dites que vous voulez montrer à l'utilisateur « tous les tags », voulez-vous dire toutes les balises qui existent pour un listid donné? Ou seulement ceux qui correspondent? Et si la description est "% dragon%", dragon est-il l'un des tags que vous voulez renvoyer même s'il n'est pas dans file_tags?

1

Il serait plus logique de rejoindre les tables.

SELECT name, synonym, description, tag_name FROM `files_list` WHERE (name LIKE '%dragon%' OR synonym LIKE '%dragon%' OR description LIKE '%dragon%' OR name LIKE '%ball%' OR synonym LIKE '%ball%' OR description LIKE '%ball%') 
OUTER JOIN files_tags on files_tags.listid = files_list.listid 

OUTER JOIN fera que toutes les étiquettes sont sélectionnées, cela va créer des lignes en double lorsque plusieurs balises par id sont disponibles, avec la seule différence étant la balise

+0

Ne fonctionne que si ceux-ci sont clés relationnelles – KindaTechy