I need to make a query to search and filter on multiple terms.
I have a table with weapons and all can have multiple tags. I want to be able to create a filter o
Try this:
SELECT * FROM wp_posts AS p
LEFT JOIN wp_term_relationships AS tr ON p.ID = tr.object_id
LEFT JOIN wp_terms AS t ON tr.term_taxonomy_id = t.term_id
WHERE p.id IN
(
SELECT p2.id FROM wp_posts AS p2
LEFT JOIN wp_term_relationships AS tr2 ON p2.ID = tr2.object_id
LEFT JOIN wp_terms AS t2 ON tr2.term_taxonomy_id = t2.term_id
GROUP BY p2.id
HAVING FIND_IN_SET('blue', GROUP_CONCAT(t2.term)) AND FIND_IN_SET('old', GROUP_CONCAT(t2.term))
)
Turn it around. That is start with tag IN ('blue', 'old')
in the innermost subquery. From that, find the tag_ids
. From them, find the weapon_ids
HAVING COUNT(*) = 2
. Last, in the outermost query, get the weapon.name
.
No EXISTS()
. No LEFT JOINs
; I'm not sure you needed LEFT
in the first place.
Your original attempt needed to join to tag
twice with different aliases. I avoid that by using the IN
and HAVING
.
More
Yeah, that gets a bit tricky...
SELECT
FROM
( SELECT weapon_id
FROM weapon_tags
JOIN weapon_tag_links USING(tag_id)
WHERE tag IN ('blue', 'old')
GROUP BY weapon_id
HAVING COUNT(*) >= 2
) a
JOIN weapons w ON w.id = a.weapon_id;
It would be easier if you had not normalized tags.