2012-08-12 94 views
0

這是我在SO上的第一個問題。所以我有一個名爲posts的MYSQL表格,其列如下:在MYSQL查詢中使用GROUP BY和union

post,tag1,tag2。

假設表中有10個總計行。該帖子9在只有標籤1標籤,以及第十具有TAG1和TAG2(在標籤2的標籤被複制在TAG1的其他職位。)標籤繼承人的表會是什麼樣子:

Tag1    Tag2 
computer    - 
tv      - 
computer    - 
tv      - 
laptop     - 
bicycle    - 
stereo     - 
computer    laptop 
tv      - 
laptop     - 

我想要的功能是查詢表格以獲取頻率最高的標籤,將它們分組在一起,然後按照從最高頻率到最低頻率的順序進行排序。這裏是我的MySQL查詢(我使用的PDO):

SELECT count, tag 
FROM (SELECT count(tag1) as count, tag1 as tag FROM posts) as a 
UNION ALL 
SELECT count(tag2) as count, tag2 as tag 
FROM posts 

此查詢不工作,因爲它並沒有告訴我每個存在的標籤,也似乎並沒有被添加在一個標籤列tag2到tag1的結果,而不是重複。所以我沒有看到筆記本電腦出現3次,而是看到筆記本電腦出現兩次,然後出現一次。

我想這將由GROUP BY解決,但是當我嘗試添加GROUP BY時,mysql會拋出一個通用語法錯誤,說要查看我的數據庫服務器的文檔。所以我想我不知道把GROUP BY放在哪裏,我可能會認爲我的查詢根本就不正確。任何可用的幫助,請.... ive看了許多其他問題關於使用組與工會,只是沒有找到答案或我不明白這足以知道我什麼時候看到答案。

+0

什麼是您查詢用GROUP BY拋出語法錯誤? – 2012-08-12 08:19:38

+0

我基本上只是修改上面的查詢,在第一個FROM之後有另一個開放的parens,然後是第二個post之後的另一個開始parens,然後添加GROUP BY標記。這沒有用,下面的答案讓我想要成爲我。只是不知道該說什麼纔是正確的答案,因爲他們每個人都幫我弄清楚了。 – Cbomb 2012-08-12 09:35:39

回答

3

我想你的意思是這樣的(sqlfiddle):

SELECT COUNT(*), tag 
FROM 
(
    SELECT Tag1 AS tag 
    FROM posts 
    UNION ALL 
    SELECT Tag2 AS tag 
    FROM posts 
) AS alltags 
GROUP BY tag 
+0

太棒了。謝謝。這樣可行。 – Cbomb 2012-08-12 08:43:26

1

嘗試:

SELECT tag, count(*) AS frequency 
FROM 
(
    SELECT tag1 AS tag FROM posts 
    UNION ALL SELECT tag2 AS tag FROM posts 
) AS alltags 
WHERE tag IS NOT NULL 
GROUP BY tag 
ORDER BY frequency DESC 

請注意,你需要UNION ALL的UNION執行隱不同

+0

謝謝你。能夠將你在ORDER BY部分做的事情與上面的答案結合起來。似乎現在工作得很好。 – Cbomb 2012-08-12 08:44:28