2009-03-09 8 views
1

J'écris un programme PHP/MySQL et j'aimerais savoir comment effectuer une recherche sur plusieurs tables en utilisant MySQL. Fondamentalement, j'ai un champ de recherche comme en haut à droite de la plupart des sites, et lorsque l'utilisateur recherche quelque chose dans cette boîte, il doit chercher dans users.username, users.profile_text, uploads.title, uploads.description, sets.description et comments.text. J'ai besoin d'obtenir l'ID (stocké dans un champ d'identification dans chaque tableau) et si possible, un google comme extrait.Recherche de plusieurs tables avec MySQL

Répondre

4

Vous pouvez écrire votre procédure pour interroger chacune de ces tables individuellement, ou vous pouvez créer une vue relativement simple qui conglomère toutes les colonnes interrogeables des tables importantes avec un indicateur indiquant de quelle table elles proviennent. Il n'y a pas vraiment de manière magique de rechercher plusieurs tables autres que d'écrire les instructions normalement.

La seconde approche ressemblerait à quelque chose comme ceci:

(SELECT 'Table 1' AS TableName, id as Id, text as Searchable 
FROM table1) 
UNION 
(SELECT 'Table 2' AS TableName, table2_id as Id, name as Searchable 
FROM table2) 
UNION 
... 

Ensuite, la recherche sur la vue obtenue. Il est important de noter que cette méthode ne sera pas rapide. Une alternative similaire et plus rapide consisterait à dédier une table à cette tâche au lieu d'une vue, et à la remplir lors de l'insertion/mise à jour/suppression des tables réelles au lieu de la recalculer lors de l'accès.

+0

+1 très intéressant, merci pour infos – vitto

+0

Le 3e approché (table dédiée) peut être améliorée: 1 - La vue dédiée peut être mis à jour automatiquement avec les déclencheurs: a) pour chaque table ('Table 1',' Table 2'); b) pour l'événement AFTER (minimise le temps de réponse). c) pour tous les types d'instructions (INSERT, UPDATE, DELETE); 2 - Vous devez ajouter une colonne supplémentaire (par exemple 'source') avec le nom de la table/entité à partir duquel les données ont été récupérées pour d'éventuelles actions supplémentaires. –

0

Pour écrire une requête de sélection adaptée à chacune des tables, vous pouvez regrouper les résultats pour obtenir un ensemble de résultats. On dirait que cela ressemblera à quelque chose comme ceci:

select 'user-name', id, username from users where username like '%term%' 
union 
select 'user-profile', id, profile from users where profile like '%term%' 
union 
select 'uploads-title', id, title from uploads where title like '%term%' 
union 
select 'uploads-description', id, description from uploads where description like '%term%' 
Questions connexes