sql >> Database >  >> RDS >> Mysql

welke mysql-query moet ik gebruiken om een ​​categorie te selecteren die overeenkomt met AL mijn criteria?

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
        )

Je moet een UNIQUE . hebben index op (cat_id, product_id) (in deze volgorde) om dit snel te laten werken.

Deze oplossing gebruikt INDEX FOR GROUP BY om een ​​lijst met verschillende categorieën te krijgen, en EXISTS predikaat zal iets sneller zijn dan COUNT(*) (aangezien de aggregatie enige overhead vereist).

Als u meer dan twee producten moet zoeken, pas dan het eerste argument aan tot LIMIT dienovereenkomstig.

Het moet LIMIT n - 1, 1 . zijn , waarbij n is het aantal items in de IN lijst.

Bijwerken:

Gebruik dit om de categorieën terug te sturen die alle producten van de lijst bevatten en niets anders:

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. Hoe u uw ProxySQL kunt bewaken met Prometheus en ClusterControl

  2. Gegevens van orakel in utf-8 met php

  3. Een voorwaardelijke SQL-update-instructie voor twee tabellen tegelijk

  4. Het gebruikte tabeltype ondersteunt geen SPATIAL-indexen