sql >> Database teknologi >  >> RDS >> Mysql

hvilken mysql-forespørgsel skal jeg bruge til at vælge en kategori, der matcher ALLE mine kriterier?

SELECT  cat_id
FROM    (
        SELECT  DISTINCT cat_id
        FROM    cat_product
        ) cpo
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    cat_product cpi
        WHERE   cpi.cat_id = cpo.cat_id
                AND product_id IN (2, 3)
        LIMIT 1, 1
        )

Du skal have en UNIQUE indeks på (cat_id, product_id) (i denne rækkefølge) for at dette virker hurtigt.

Denne løsning vil bruge INDEX FOR GROUP BY for at få en liste over forskellige kategorier og EXISTS prædikat vil være en lille smule hurtigere end COUNT(*) (da sammenlægningen kræver nogle overhead).

Hvis du har mere end to produkter at søge efter, skal du justere det første argument til LIMIT tilsvarende.

Det skal være LIMIT n - 1, 1 , hvor n er antallet af elementer i IN liste.

Opdatering:

For at returnere de kategorier, der indeholder alle produkter fra listen og intet andet, skal du bruge denne:

SELECT  cat_id
FROM    (
        SELECT  DISTINCT cat_id
        FROM    cat_product
        ) cpo
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    cat_product cpi
        WHERE   cpi.cat_id = cpo.cat_id
                AND product_id IN (2, 3)
        LIMIT 1, 1
        )
        AND NOT EXISTS
        (
        SELECT  NULL
        FROM    cat_product cpi
        WHERE   cpi.cat_id = cpo.cat_id
                AND product_id NOT IN (2, 3)
        )


  1. Sådan opretter du et DB-link mellem to oracle-instanser

  2. Føj en databasepostkonto til en profil (SSMS)

  3. Indeks til at finde et element i et JSON-array

  4. viser én kolonne flere gange med data fra 3 forskellige datointervaller