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

SQL:Pobierz produkty z kategorii, ale muszą również znajdować się w innym zestawie kategorii

Ten typ problemu nazywa się podziałem relacyjnym .

Istnieją dwa popularne rozwiązania:

  1. Pierwsze rozwiązanie łączy pasujące kategorie i porównuje ze stałym ciągiem:

    SELECT p2c.product_id
    FROM oc_product_to_category p2c
    GROUP BY p2c.product_id
    HAVING GROUP_CONCAT(p2c.category_id SEPARATOR ',' ORDER BY p2c.category_id) = '1,2'
    
  2. Drugie rozwiązanie to JOIN dla każdej wymaganej wartości:

    SELECT p.product_id 
    FROM oc_product p 
    INNER JOIN oc_product_to_category p2c1 
      ON (p.product_id = p2c1.product_id AND p2c1.category_id = 1) 
    INNER JOIN oc_product_to_category p2c2 
      ON (p.product_id = p2c2.product_id AND p2c2.category_id = 2) 
    

Rozwiązania te opisuję w mojej prezentacji Zoptymalizowane wzorce zapytań SQL . Podczas moich testów stwierdziłem, że rozwiązanie łączenia jest znacznie lepsze pod względem wydajności.

Sugestia @Toma jest słuszna, oto jak wyglądałoby to w kompletnym zapytaniu:

    SELECT p.product_id, GROUP_CONCAT(p2c3.category_id SEPARATOR ',') AS categories
    FROM oc_product p 
    INNER JOIN oc_product_to_category p2c1 
      ON (p.product_id = p2c1.product_id AND p2c1.category_id = 1) 
    INNER JOIN oc_product_to_category p2c2 
      ON (p.product_id = p2c2.product_id AND p2c2.category_id = 2) 
    INNER JOIN oc_product_to_category p2c3
      ON (p.product_id = p2c3.product_id)
    GROUP BY p.product_id;

DISTINCT co sugeruje @Tom nie powinno być konieczne, ponieważ twoja tabela p2c powinna mieć ograniczenie UNIQUE (id_produktu, identyfikator_kategorii).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Typ Mysql Time daje ArgumentError:argument jest poza zakresem w Rails, jeśli trwa ponad 24 godziny

  2. Oblicz różnicę między dwoma datami w MySQL

  3. Ściągawka z poleceniami SQL – jak nauczyć się SQL w 10 minut

  4. Jak włączyć ENUMy w Symfony 2 / Doctrine?

  5. MySQL dodaje pola do Enum