sql >> Databáze >  >> RDS >> Mysql

jaký dotaz mysql bych měl použít k výběru kategorie, která odpovídá VŠEM mým kritériím?

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
        )

Musíte mít UNIQUE index na (cat_id, product_id) (v tomto pořadí), aby to fungovalo rychle.

Toto řešení bude používat INDEX FOR GROUP BY získáte seznam různých kategorií a EXISTS predikát bude o něco rychlejší než COUNT(*) (protože agregace vyžaduje určitou režii).

Pokud máte hledat více než dva produkty, upravte první argument na LIMIT podle toho.

Mělo by být LIMIT n - 1, 1 , kde n je počet položek v IN seznam.

Aktualizace:

Chcete-li vrátit kategorie obsahující všechny produkty ze seznamu a nic jiného, ​​použijte toto:

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. Řešení, které nemůže provést operaci DML uvnitř dotazu?

  2. Jak zkopírovat databázové tabulky a každý záznam z jednoho databázového serveru na jiný databázový server v PHP MYSQL?>

  3. mysql_fetch_array přidat všechny řádky?

  4. CREATE TABLE MySQL vs T-SQL s příklady syntaxe