sql >> Databasteknik >  >> RDS >> Mysql

vilken mysql-fråga ska jag använda för att välja en kategori som matchar ALLA mina 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 måste ha en UNIQUE index på (cat_id, product_id) (i denna ordning) för att detta ska fungera snabbt.

Denna lösning kommer att använda INDEX FOR GROUP BY för att få en lista över distinkta kategorier och EXISTS predikatet kommer att vara lite snabbare än COUNT(*) (eftersom aggregeringen kräver viss overhead).

Om du har mer än två produkter att söka efter, justera det första argumentet till LIMIT i enlighet därmed.

Det ska vara LIMIT n - 1, 1 , där n är antalet objekt i IN lista.

Uppdatering:

För att returnera kategorierna som innehåller alla produkter från listan och inget annat, använd detta:

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. MySQL 'Uppdatera tidsstämpel'-kolumn - utlösare

  2. Initial array i funktion för att aggregera flerdimensionell array

  3. Fil-URL:er eller hur man öppnar mapp från URL

  4. Är Sphinx automatisk uppdatering index när du lägger till data i din SQL?