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

Comment sélectionner des utilisateurs avec plusieurs balises à l'aide de jointures SQL ?

DDD
DDDoriginal
2024-12-20 05:41:14218parcourir

How to Select Users with Multiple Tags Using SQL Joins?

Comment implémenter des conditions SQL sur plusieurs lignes dans une jointure

Le problème présenté tourne autour de la sélection des utilisateurs qui possèdent deux balises spécifiques d'une jointure opération. Alors que l'exemple fourni utilisant IN renvoie les utilisateurs avec l'une ou l'autre des balises, le résultat souhaité est de récupérer les utilisateurs qui possèdent les deux balises. Pour ce faire, il est inapproprié d'exploiter le mot-clé ALL.

Solutions

1. Test de différentes lignes

  • Sous-requêtes EXISTS : Vérifiez l'existence de lignes correspondant aux conditions dans plusieurs lignes.
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 : Sélectionnez les utilisateurs correspondant aux conditions dans plusieurs lignes.
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 : Créez plusieurs jointures pour chaque condition de balise.
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 (nécessite une protection des données) : Comptez les lignes agrégées pour garantir la présence des deux balises.
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 (spécifiques à la base de données) : Concaténer les noms de balises et vérifier la présence de balises spécifiques en utilisant des fonctions spécifiques à la base de données.
(MySQL Specific)
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 

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