I have the following MySQL Query. This query is used on my shop to retrieve products after a customer has used the filtering to narrow down results.
I'd like to modify this query so only products are returned that meet ALL the filtering criteria, right now it returns any product that meets at least one of the selected criteria.
The line responsible for this is towards the end of the query: AND pf.filter_id IN (7,3,40)
Is it possible to modify this query to achieve my desired behavior?
What I have tried so far (that didn't work):
I changed
AND pf.filter_id IN (7,3,40)
to
AND pf.filter_id = 7 AND AND pf.filter_id = 3 AND AND pf.filter_id = 40
SELECT p.product_id,
(SELECT AVG(rating) AS total
FROM review r1
WHERE r1.product_id = p.product_id
AND r1.status = '1'
GROUP BY r1.product_id) AS rating,
(SELECT price
FROM product_discount pd2
WHERE pd2.product_id = p.product_id
AND pd2.customer_group_id = '1'
AND pd2.quantity = '1'
AND ((pd2.date_start = '0000-00-00'
OR pd2.date_start < NOW())
AND (pd2.date_end = '0000-00-00'
OR pd2.date_end > NOW()))
ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount,
(SELECT price
FROM product_special ps
WHERE ps.product_id = p.product_id
AND ps.customer_group_id = '1'
AND ((ps.date_start = '0000-00-00'
OR ps.date_start < NOW())
AND (ps.date_end = '0000-00-00'
OR ps.date_end > NOW()))
ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special
FROM product_to_category p2c
LEFT JOIN product_filter pf ON (p2c.product_id = pf.product_id)
LEFT JOIN product p ON (pf.product_id = p.product_id)
LEFT JOIN product_description pd ON (p.product_id = pd.product_id)
LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id)
WHERE pd.language_id = '1'
AND p.status = '1'
AND p.date_available <= NOW()
AND p2s.store_id = '0'
AND p2c.category_id = '124'
AND pf.filter_id IN (7,3,40)
GROUP BY p.product_id
ORDER BY p.sort_order ASC,
LCASE(pd.name) ASC LIMIT 0,1
Sample product in product_filter
table that has multiple filters:
product_id filter_id
753 6
753 7
753 44
753 47
Result of SELECT filter_id, count(*) FROM product_filter GROUP BY filter_id
(sample)
filter_id count(*)
1 146
2 644
3 421
4 171
5 90
6 46
7 80
8 82