2011-11-13 119 views
0

我確定必須有一種方法可以做到這一點,但是我的MySQL知識讓我失望。MySQL COUNT結果UNION ALL語句

我有一個存儲頁面標記單個表

page_id   tag 
51    New Zealand 
51    Trekking 
58    UK 
77    New Zealand 
77    Trekking 
89    City Break 
101    Shopping 
... 

我希望做有兩個標籤頁,例如搜索「新西蘭」和「徒步旅行」。我看過UNION,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?? 

我基本上是想UNION兩個搜索在一起,「保持」的副本並放棄其餘部分。這是可能的一種簡單的方式,或者我需要開始變得複雜嗎?

回答

3

如果我理解正確的話,這應該這樣做:

SELECT page_id, count(*) 
FROM tags 
WHERE tag IN ('New Zealand', 'Trekking') 
GROUP BY page_id 
HAVING count(*) > 1 

如果您從同一個表中選擇,則不需要使用UNION。

+0

完美。非常感謝你。 「當你知道如何時很容易」。 – Darrell

-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 
+0

在mysql中存在CREATE TEMPORARY TABLE ...但它可以很容易地使用嵌套查詢... – aleroot

+1

雖然這種方法有點太複雜,你可以至少使用'CREATE TEMPORARY TABLE temporary_table ...'而不是創建一個硬表。那麼你最終不需要「放棄」它。但是,這個問題可以在沒有中間表的情況下回答。 –

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" 

 
看似是正確的,嗯,但檢查一次......,將ping回來,如果我發現更容易和更準確