Een tijdje geleden vroeg ik me af hoe ik een AND/OR filter kon implementeren in SQL: https://gathering.tweaker...message/48819529#48819529
Nu zou ik ook de functionaliteit willen voorzien om deze om te draaien.
Stel bijvoorbeeld met de tabellen product, category en product_has_category waarbij een product geen of meerdere categorieen kan hebben.
De OR filter lijkt me eenvoudig te implementeren:
Als ik hetzelfde wil doen bij een AND filter door gebruik te maken van meerdere joins (subquery in MySQL is trager) wordt dit echter enorm traag bij meerdere categorieen omdat er veel meer rijen verwerkt moeten worden.
Hoe kan ik dit efficienter doen?
Nu zou ik ook de functionaliteit willen voorzien om deze om te draaien.
Stel bijvoorbeeld met de tabellen product, category en product_has_category waarbij een product geen of meerdere categorieen kan hebben.
De OR filter lijkt me eenvoudig te implementeren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| SELECT product.id, product.name FROM product LEFT JOIN product_has_category ON product.id = product_has_category.product_id LEFT JOIN category ON product_has_category.category_id = category.id WHERE category.id NOT IN (1, 2, 3) OR category.id IS NULL GROUP BY product.id, product.name |
Als ik hetzelfde wil doen bij een AND filter door gebruik te maken van meerdere joins (subquery in MySQL is trager) wordt dit echter enorm traag bij meerdere categorieen omdat er veel meer rijen verwerkt moeten worden.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| SELECT product.id, product.name FROM product LEFT JOIN product_has_category phc1 ON product.id = phc1.product_id LEFT JOIN product_has_category phc2 ON product.id = phc2.product_id LEFT JOIN product_has_category phc3 ON product.id = phc3.product_id LEFT JOIN product_has_category phc_null ON product.id = phc_null.product_id WHERE (phc1.category_id <> 1 AND phc2.category_id <> 3 AND phc3.category_id <> 2) OR phc_null.category_id IS NULL GROUP BY product.id, product.name |
Hoe kan ik dit efficienter doen?
[ Voor 17% gewijzigd door gnoe93 op 25-10-2016 22:51 ]