Reputation: 125
I'm sure there must be a way to do this but my MySQL knowledge is holding me back.
I have a single table that stores page tags
page_id tag
51 New Zealand
51 Trekking
58 UK
77 New Zealand
77 Trekking
89 City Break
101 Shopping
...
I want to do a search for pages that have two tags, e.g. "New Zealand" and "Trekking". I've looked at UNIONS, INTERSECT (equiv), JOINS and I can't work out what is the best way to do it. The best I have come up with is to do:
SELECT page_id FROM tags
WHERE tag = "New Zealand"
UNION ALL
SELECT page_id FROM tags
WHERE tag = "Trekking"
... and then some kind of COUNT on those pages that feature twice??
I essentially want to UNION the two searches together and 'keep' the duplicates and discard the rest. Is this possible in a simple way or do I need to start getting complex with it?
Upvotes: 0
Views: 545
Reputation: 3201
Considering that you want page_id that have both tag "New Zealand" and "Trekking"
SELECT t1.page_id
FROM tags t1, tags t2
WHERE t1.page_id = t2.page_id
AND
t1.tag="New Zealand"
AND
t2.tag="Trekking"
Seems to be Right, hmm but check once..., will ping back if i found easier and more accurate
Upvotes: 0
Reputation:
If I understood you correctly, this should do it:
SELECT page_id, count(*)
FROM tags
WHERE tag IN ('New Zealand', 'Trekking')
GROUP BY page_id
HAVING count(*) > 1
You don't need to use a UNION if you select from the same table.
Upvotes: 3
Reputation: 1813
try this
CREATE TABLE temporary
SELECT page_id FROM tags
WHERE tag = "New Zealand"
UNION ALL
SELECT page_id FROM tags
WHERE tag = "Trekking"
then try this
SELECT COUNT(*) FROM temporary
don't forget to
DROP TABLE temporary
Upvotes: -1