Mysql
 sql >> Baza danych >  >> RDS >> Mysql

jakiego zapytania mysql powinienem użyć, aby wybrać kategorię, która pasuje do WSZYSTKICH moich kryteriów?

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
        )

Musisz mieć UNIQUE indeks na (cat_id, product_id) (w tej kolejności), aby to działało szybko.

To rozwiązanie użyje INDEX FOR GROUP BY aby uzyskać listę różnych kategorii i EXISTS predykat będzie trochę szybszy niż COUNT(*) (ponieważ agregacja wymaga trochę narzutu).

Jeśli masz więcej niż dwa produkty do wyszukania, dostosuj pierwszy argument do LIMIT odpowiednio.

Powinno to być LIMIT n - 1, 1 , gdzie n to liczba pozycji w IN lista.

Aktualizacja:

Aby zwrócić kategorie zawierające wszystkie produkty z listy i nic więcej, użyj tego:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zachowanie MySQL „wybierz do aktualizacji”

  2. Jak połączyć się z bazą danych MySQL w Pythonie?

  3. mysqldbcompare odmowa dostępu, ale polecenie mysql działa

  4. W jaki sposób mysql odwraca rozwiązywanie adresów IP?

  5. znajdź powody zakleszczenia mysql