Comment effectuer une simple recherche SQL en une seule instruction dans les tables ?

StackOverflow https://stackoverflow.com/questions/56334

  •  09-06-2019
  •  | 
  •  

Question

Supposons qu'il existe deux tables : users et groups.

Comment proposer une « recherche simple » dans laquelle un utilisateur saisit du texte et les résultats contiennent à la fois des utilisateurs et des groupes dont les noms contiennent le texte ?

Le résultat de la recherche doit distinguer les deux types.

Était-ce utile?

La solution

L'astuce consiste à combiner un UNION avec une chaîne littérale pour déterminer le type de « objet » renvoyé.Dans la plupart (?) des cas, UNION ALL sera plus efficace et devra être utilisé à moins que des doublons ne soient requis dans les sous-requêtes.Le modèle suivant devrait suffire :

 SELECT "group" type, name
   FROM groups
  WHERE name LIKE "%$text%"
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE name LIKE "%$text%"

NOTE:J'ai ajouté la réponse moi-même, car j'ai rencontré ce problème hier, je n'ai pas trouvé de bonne solution et j'ai utilisé cette méthode.Si quelqu'un a une meilleure approche, n'hésitez pas à l'ajouter.

Autres conseils

Si vous utilisez "UNION ALL", la base de données n'essaie pas de supprimer les doublons - vous n'aurez de toute façon pas de doublons entre les deux requêtes (puisque la première colonne est différente), donc UNION ALL sera plus rapide.
(Je suppose que vous n'avez pas de doublons dans chaque requête que vous souhaitez supprimer)

L'utilisation de LIKE entraînera un certain nombre de problèmes car elle nécessitera une analyse de table à chaque fois que le comparateur LIKE démarre par un %.Cela oblige SQL à vérifier chaque ligne et à parcourir, octet par octet, la chaîne que vous utilisez à des fins de comparaison.Même si cela peut convenir au démarrage, cela entraîne rapidement des problèmes de mise à l'échelle.

Une meilleure façon de gérer cela consiste à utiliser la recherche en texte intégral.Bien que cette option soit plus complexe, elle vous fournira de meilleurs résultats pour les très grandes bases de données.Ensuite, vous pouvez utiliser une version fonctionnelle de l'exemple que Bobby Jack vous a donné UNION ALL vos deux ensembles de résultats ensemble et affichez les résultats.

Je suggérerais un autre ajout

 SELECT "group" type, name
   FROM groups
  WHERE UPPER(name) LIKE UPPER("%$text%")
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE UPPER(name) LIKE UPPER("%$text%")

Vous pouvez d'abord convertir $text en majuscules ou simplement le faire dans la requête.De cette façon, vous obtenez une recherche insensible à la casse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top