0

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?

Adam Rackis
  • 82,527
  • 56
  • 270
  • 393
Darrell
  • 125
  • 2
  • 8

3 Answers3

3

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.

0
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
Gaurav Gandhi
  • 3,041
  • 2
  • 27
  • 40
-1

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
cristi _b
  • 1,783
  • 2
  • 28
  • 43
  • In mysql exist CREATE TEMPORARY TABLE ... but it can be done easily with a nested query ... – aleroot Nov 13 '11 at 12:20
  • 1
    Although this approach is a bit too complex, you could at least use `CREATE TEMPORARY TABLE temporary_table ...` instead of creating a hard table. Then you don't have to `DROP` it in the end. However, the question can be answered without an intermediate table. – Dan Soap Nov 13 '11 at 12:21