Maison >base de données >tutoriel mysql >Comment trouver efficacement des utilisateurs avec plusieurs balises à l'aide de jointures SQL ?
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 :
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')
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')
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 :
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
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!