sql >> Database >  >> RDS >> Mysql

mysql een-op-veel-query met ontkenning en/of meerdere criteria

Ik zou de uitsluitingsjoin schrijven zonder subquery's:

SELECT p.productid
FROM   products p
INNER JOIN producttags AS t ON p.productid = t.productid
LEFT OUTER JOIN producttags AS x ON p.productid = x.productid 
       AND x.tag IN ('Motorcycle', 'Green')
WHERE  p.active = 1
       AND t.tag IN ( 'Ford', 'Black', 'Skateboard' )
       AND x.productid IS NULL;

Zorg ervoor dat je een index op producten hebt over de twee kolommen (actief, product-id) in die volgorde.

Je zou ook een index op producttags moeten hebben over de twee kolommen (productid, tag) in die volgorde.

Een andere vraag die ik moet doen, is zoiets als alles (Auto) of (Skateboard) of (Groen EN Motorfiets) of (Rood EN Motorfiets).

Soms zijn deze complexe omstandigheden moeilijk voor de MySQL-optimizer. Een veelvoorkomende oplossing is om UNION te gebruiken om eenvoudigere zoekopdrachten te combineren:

SELECT p.productid
FROM   products p
INNER JOIN producttags AS t1 ON p.productid = t1.productid
WHERE  p.active = 1
   AND t1.tag IN ('Car', 'Skateboard')

UNION ALL

SELECT p.productid
FROM   products p
INNER JOIN producttags AS t1 ON p.productid = t1.productid
INNER JOIN producttags AS t2 ON p.productid = t2.productid 
WHERE  p.active = 1
   AND t1.tag IN ('Motorcycle')
   AND t2.tag IN ('Green', 'Red');

PS:Uw tagging-tabel is geen Entity-Attribute-Value-tabel.



  1. Hibernate door overbodige queries naar de database te sturen

  2. hoe te gebruiken (useUnicode=yes characterEncoding=UTF-8) met DBCP

  3. Controleren of mysql-gebruiker bestaat

  4. Kan authenticatie-plug-in 'caching_sha2_password' in Netbean niet laden