sql >> Databasteknik >  >> RDS >> Mysql

SQL:Få produkter från en kategori men måste också vara i en annan uppsättning kategorier

Den här typen av problem kallas relationsdelning .

Det finns två vanliga lösningar:

  1. Första lösningen sammanfogar de matchande kategorierna och jämför med en fast sträng:

    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. Den andra lösningen gör en JOIN för varje önskat värde:

    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) 
    

Jag täcker dessa lösningar i min presentation SQL-frågemönster, optimerade . Jag upptäckte i mina tester att join-lösningen är mycket bättre för prestanda.

@Toms förslag är rätt, så här skulle det se ut i en fullständig fråga:

    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 som @Tom föreslår borde inte vara nödvändigt, eftersom din p2c-tabell bör ha en UNIK begränsning över (product_id, category_id).




  1. Välj i en många-till-många-relation i MySQL

  2. Dumpa filen MySQL 5.6.10

  3. Använda INNER JOIN för att kombinera SQL Server-tabeller och visa dem i ASP.NET-webbformulär

  4. Använder libmysqlclient i flertrådsapplikation