Maison >base de données >tutoriel mysql >Comment trouver efficacement des utilisateurs avec plusieurs balises à l'aide de jointures SQL ?

Comment trouver efficacement des utilisateurs avec plusieurs balises à l'aide de jointures SQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-23 17:30:14875parcourir

How to Efficiently Find Users with Multiple Tags Using SQL Joins?

SQL pour l'application de conditions à plusieurs lignes dans une jointure

Problème :

Déterminer les utilisateurs qui possèdent les deux « tag1 » et 'tag2' tout en évitant l'effet de l'utilisation de 'IN', qui renvoie les utilisateurs avec l'un ou l'autre tag.

Solution :

Pour sélectionner des lignes du tableau A en fonction de deux conditions de ligne du tableau B, choisissez l'une de ces stratégies :

1. Test de différentes lignes :

  • Clause EXISTS : Vérifie l'existence de lignes dans le tableau B qui correspondent aux conditions.
SELECT * FROM users WHERE 
  EXISTS (SELECT * FROM tags WHERE user_id = users.id AND name ='tag1') AND
  EXISTS (SELECT * FROM tags WHERE user_id = users.id AND name ='tag2')
  • Sous-requêtes : Correspondances basées sur les lignes du tableau B.
SELECT * FROM users WHERE 
  id IN (SELECT user_id FROM tags WHERE name ='tag1') AND
  id IN (SELECT user_id FROM tags WHERE name ='tag2') 
  • JOINs : Agrége les lignes en se joignant plusieurs fois à la table B.
SELECT u.* FROM users u 
     INNER JOIN tags t1 ON u.id = t1.user_id
     INNER JOIN tags t2 ON u.id = t2.user_id
  WHERE t1.name = 'tag1' AND t2.name = 'tag2'

2. Agrégation de lignes :

  • COUNT : Convient si la table B protège contre les balises en double.
SELECT users.id, users.user_name 
   FROM users INNER JOIN tags ON users.id = tags.user_id
   WHERE tags.name IN ('tag1', 'tag2')
   GROUP BY users.id, users.user_name
   HAVING COUNT(*) = 2
  • Traitement des chaînes (pas de SQL standard) : Concatène les balises en une chaîne et vérifie la présence de balises spécifiques balises.
SELECT user.id, users.user_name, GROUP_CONCAT(tags.name) as all_tags
  FROM users INNER JOIN tags ON users.id = tags.user_id
  GROUP BY users.id, users.user_name
  HAVING FIND_IN_SET('tag1', all_tags) > 0 AND
         FIND_IN_SET('tag2', all_tags) > 0 

Recommandation :

Pour une évolutivité optimale, envisagez d'utiliser COUNT avec des balises protégées ou une agrégation interne si plusieurs balises peuvent apparaître pour un utilisateur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn