Mysql
 sql >> база данни >  >> RDS >> Mysql

SQL:Вземете продукти от категория, но също така трябва да са в друг набор от категории

Този тип проблем се нарича релационно деление .

Има две общи решения:

  1. Първото решение обединява съвпадащите категории и сравнява с фиксиран низ:

    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. Второто решение прави JOIN за всяка изисквана стойност:

    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) 
    

Разглеждам тези решения в моята презентация SQL модели на заявки, оптимизирани . В моите тестове открих, че решението за присъединяване е много по-добро за производителност.

Предложението на @Tom е правилно, ето как би изглеждало това в пълна заявка:

    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 което @Tom предполага, че не трябва да е необходимо, тъй като вашата p2c таблица трябва да има УНИКАЛНО ограничение над (product_id, category_id).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. използване на нулеви стойности в подготвено изявление на mysqli

  2. ще покаже състоянието на таблицата, показва точните редове в таблицата?

  3. Предупреждение:mysql_connect():Не мога да се свържа с локален MySQL сървър

  4. Някакъв начин да изберете от таблицата на MySQL, където полето завършва с определен знак/число?

  5. JDBC Изберете пакетиране/размер на извличане с MySQL