Application de conditions à plusieurs lignes dans une jointure à l'aide de SQL
Lorsque vous travaillez avec des jointures, il est souvent nécessaire d'appliquer des critères spécifiques à plusieurs lignes dans une table jointe. Ceci peut être réalisé à l'aide de diverses techniques qui impliquent soit de tester des lignes individuelles, soit de regrouper des lignes.
Test de lignes individuelles à l'aide d'EXISTS, de sous-requêtes et de jointures
1A. EXISTE :
Cette méthode permet de vérifier l'existence de lignes qui satisfont à certaines 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');
1B. Sous-requêtes :
Les sous-requêtes peuvent également être utilisées pour sélectionner des lignes en fonction des conditions dans les tables jointes.
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');
1C. JOIN :
Les INNER JOIN peuvent être utilisées pour tester des conditions sur plusieurs lignes. Cependant, l'évolutivité de cette méthode est inférieure à celle des autres.
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';
Agrégation de lignes à l'aide de COUNT et du traitement de chaînes
2A. COUNTs :
Cette technique repose sur l'agrégation des lignes par nombre. Il est efficace lorsque les balises ne peuvent pas être appliquées plusieurs fois au même utilisateur.
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;
2B. Traitement des chaînes :
Pour les bases de données qui fournissent des extensions de traitement de chaînes, telles que GROUP_CONCAT et FIND_IN_SET, le traitement des chaînes peut être utilisé pour vérifier plusieurs balises. Cependant, cette méthode peut s'avérer inefficace.
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!