Maison >base de données >tutoriel mysql >Comment simuler efficacement une condition « ET » sur plusieurs lignes dans SQL ?

Comment simuler efficacement une condition « ET » sur plusieurs lignes dans SQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-05 17:43:44565parcourir

How to Efficiently Simulate an

Simuler un "ET" sur plusieurs lignes en SQL

Dans le domaine des bases de données relationnelles, la récupération efficace des données en fonction de plusieurs critères est cruciale , en particulier lorsqu'il s'agit de grands ensembles de données. Considérons le scénario suivant : un tableau « tags » avec deux colonnes, « tagid » et « contentid », représentant les balises attribuées à divers éléments de contenu. L'objectif est de récupérer le "contentid" du contenu balisé avec un ensemble spécifique de tagids (par exemple, 334, 338 et 342).

Une approche naïve impliquerait des sous-requêtes imbriquées, se traduisant efficacement par :

SELECT contentid
FROM tags
WHERE tagid = 334
AND contentid IN (
    SELECT contentid
    FROM tags
    WHERE tagid = 338
    AND contentid IN (
        SELECT contentid
        FROM tags
        WHERE tagid = 342
    )
)

Bien que cette approche fonctionne, elle devient lourde et inefficace pour un grand nombre de tagids. Heureusement, il existe une solution plus efficace et extensible.

Grâce à la puissance des opérations basées sur des ensembles, une seule requête peut être formulée qui élimine le besoin de sous-requêtes :

SELECT contentID
FROM tags
WHERE tagID IN (334, 338, 342)
GROUP BY contentID
HAVING COUNT(DISTINCT tagID) = 3

Cette requête fonctionne en :

  1. Filtrer la table "tags" pour les lignes où "tagid" correspond au souhaité tagids.
  2. Regrouper les résultats par « contentID » pour identifier le contenu balisé avec ces tagids.
  3. Utiliser la clause « HAVING » pour garantir que seul le contenu balisé avec tous les tagids spécifiés (c'est-à-dire COUNT de un "tagid" unique = 3) est inclus.

Cette solution reste efficace même pour un grand nombre de tagids, car il n'implique pas de sous-requêtes imbriquées ou d'opérations récursives. La complexité temporelle reste linéaire par rapport au nombre de tagids pertinents, ce qui la rend adaptée aux grands ensembles de données et aux requêtes ad hoc.

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