sql >> Databáze >  >> RDS >> Mysql

SQL:Získejte produkty z kategorie, ale také musí být v jiné sadě kategorií

Tento typ problému se nazývá relační rozdělení .

Existují dvě běžná řešení:

  1. První řešení spojuje odpovídající kategorie a porovnává s pevným řetězcem:

    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. Druhé řešení provede JOIN pro každou požadovanou hodnotu:

    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) 
    

Tato řešení pokrývají ve své prezentaci Vzory dotazů SQL, optimalizované . Ve svých testech jsem zjistil, že řešení spojení je z hlediska výkonu mnohem lepší.

@Tomův návrh je správný, takto by to vypadalo v kompletním dotazu:

    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 navrhuje, že by to nemělo být nutné, protože váš stůl p2c by měl mít UNIKÁTNÍ omezení (product_id, category_id).




  1. PDO + MySQL a nefunkční kódování UTF-8

  2. Má T-SQL agregační funkci pro zřetězení řetězců?

  3. Veselé tweety o životě DBA

  4. Hromadné vložení do SQL Server CE