我确信必须有办法做到这一点,但我的MySQL知识让我退缩。
我有一个存储页面标记的表
page_id tag
51 New Zealand
51 Trekking
58 UK
77 New Zealand
77 Trekking
89 City Break
101 Shopping
...
我想搜索有两个标签的网页,例如“新西兰”和“徒步旅行”。我看过UNIONS,INTERSECT(equiv),JOINS,我无法弄清楚最好的方法是什么。我想出的最好的事情就是:
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??
我基本上想要将两个搜索联合起来并“保留”重复项并丢弃其余部分。这可能是一种简单的方式,还是我需要开始变得复杂?
答案 0 :(得分:3)
如果我理解正确的话,应该这样做:
SELECT page_id, count(*)
FROM tags
WHERE tag IN ('New Zealand', 'Trekking')
GROUP BY page_id
HAVING count(*) > 1
如果从同一个表中选择,则无需使用UNION。
答案 1 :(得分:0)
考虑到你希望 page_id 同时具有标签 “新西兰”和“徒步旅行”
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"
似乎是正确的,嗯但检查一次......,如果我发现更容易和更准确,将会反击
答案 2 :(得分:-1)
试试这个
CREATE TABLE temporary
SELECT page_id FROM tags
WHERE tag = "New Zealand"
UNION ALL
SELECT page_id FROM tags
WHERE tag = "Trekking"
然后尝试这个
SELECT COUNT(*) FROM temporary
别忘了
DROP TABLE temporary