sql >> Database teknologi >  >> RDS >> Mysql

SQL:Hent produkter fra en kategori, men skal også være i et andet sæt kategorier

Denne type problemer kaldes relationel opdeling .

Der er to almindelige løsninger:

  1. Første løsning samler de matchende kategorier og sammenligner med en fast streng:

    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. Anden løsning laver en JOIN for hver påkrævet værdi:

    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) 
     

Jeg dækker disse løsninger i min præsentation SQL-forespørgselsmønstre, optimerede . Jeg fandt i mine test, at joinløsningen er meget bedre for ydeevnen.

@Toms forslag er rigtigt, her er, hvordan det ville se ud i en komplet forespørgsel:

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 foreslår ikke burde være nødvendigt, fordi din p2c-tabel burde have en UNIK begrænsning over (product_id, category_id).




  1. Hvordan låses innodb-tabeller, når ON INSERT-udløseren behandles?

  2. Kræver ODP.NET installation af Oracle Client

  3. MySQL Query Performance Tuning

  4. PGError:FEJL:aggregater er ikke tilladt i WHERE-klausulen på en AR-forespørgsel af et objekt og dets har_mange objekter