Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Welche MySQL-Abfrage sollte ich verwenden, um eine Kategorie auszuwählen, die ALLEN meinen Kriterien entspricht?

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
        )

Sie müssen einen UNIQUE haben Index auf (cat_id, product_id) (in dieser Reihenfolge), damit dies schnell funktioniert.

Diese Lösung verwendet INDEX FOR GROUP BY um eine Liste unterschiedlicher Kategorien zu erhalten, und EXISTS Prädikat wird etwas schneller sein als COUNT(*) (da die Aggregation etwas Overhead erfordert).

Wenn Sie nach mehr als zwei Produkten suchen müssen, passen Sie das erste Argument auf LIMIT an entsprechend.

Es sollte LIMIT n - 1, 1 sein , wobei n ist die Anzahl der Elemente im IN Liste.

Aktualisierung:

Um die Kategorien zurückzugeben, die alle Produkte aus der Liste und nichts anderes enthalten, verwenden Sie Folgendes:

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)
        )