2015-12-21 72 views
-2

的k行可以說,我得到這個表返回出現最

photo_id user_id tag 
0  0  Car 
0  0  Bridge 
0  0  Sky 
20  1  Car 
20  1  Bridge 
2  2  Bridge 
2  2  Cat 
1  3  Cat 

我需要返回出現在大部分的K個標籤,而無需使用限制。

出現相同次數的標籤的聯合斷路器將按字典順序(最小將具有最高得分)。 每個標籤都需要他出現的標籤數量。

例如,對於上面具有k表= 2的輸出應爲:

Tag   # 
Bridge  3 
Car   2 

和對於k = 4:

Tag   # 
Bridge  3 
Car   2 
Cat   2 
Sky   1 
+0

我們可以看到您可能寫過的一些示例查詢,因爲您發佈的問題不夠清楚,無法確定您想要實現的目標。 –

+0

可以說k = 2。 我需要返回出現的大部分2個標籤,在這種情況下,我將要返回 車2 大橋2 現在可以說,K = 3,現在我將要返回出現在大部分的3個標籤 車2 大橋2 天空1 等 希望它能幫助 – Hooch

+0

GROUP BY,COUNT,ORDER BY,LIMIT ...... – jarlh

回答

1

嘗試這種情況:

SELECT t1.tag, COUNT(*) as mycount FROM table t1 
GROUP BY t1.tag 
ORDER BY mycount DESC 
LIMIT 2; 

替換您的k變量的限制量。

+0

什麼mycount代表在查詢和「k」考慮到哪裏? – Hooch

+0

對不起,我糾正我的回答 – throrin19

+0

哦,我不能使用限制,對不起:( – Hooch

0

將數據插入到表:

INSERT INTO new_table VALUES 
    (0,0,'Car'), 
    (0,0,'Bridge'), 
    (0,0,'Sky'), 
    (20,1,'Car'), 
    (20,1,'Bridge'), 
    (0,0,'bottle'); 

要查詢:

SELECT tag, COUNT(1) FROM new_table 
GROUP BY tag HAVING COUNT(1) = (
    SELECT MIN(c) FROM 
    ( 
     SELECT COUNT(1) AS c FROM new_table GROUP BY tag 
    ) AS temp 
) 

輸出:

+--------+----------+ 
| tag | count(1) | 
+--------+----------+ 
| bottle |  1 | 
| Sky |  1 | 
+--------+----------+ 

注:獲取最小計數標籤

+0

這不會工作爲k = 1(在你的例子)我想它返回橋2,因爲我得到了2橋樑和汽車和橋樑出現lexicography小他們車 – Hooch

0

雖然這是家庭作業,我們不是蘇爲了回答這些問題(直到你證明試圖解決問題並且沒有得到理想的結果),我對在這個問題中不使用LIMIT有點好奇,所以我在這裏發帖。

想法是對結果進行排名,然後選擇排名小於或等於k(如您的情況)的行。排名欄就像添加S.No.(序列號)列到您的結果,並選擇,直到所需的數字。

DDL語句:

CREATE TABLE new_table(
    photo_id INTEGER, 
    user_id INTEGER, 
    tag VARCHAR(10) 
); 


INSERT INTO new_table VALUES 
    (0, 0, 'Car'), 
    (0, 0, 'Bridge'), 
    (0, 0, 'Sky'), 
    (20, 1, 'Car'), 
    (20, 1, 'Bridge'), 
    (2, 2, 'Bridge'), 
    (2, 2, 'Cat'), 
    (1, 3, 'Cat'); 

查詢:

SELECT 
    tag, tag_count, 
    @k := @k + 1 AS k 
FROM (
    SELECT 
    tag, 
    COUNT(*) AS tag_count 
    FROM new_table 
    GROUP BY tag 
    ORDER BY tag_count DESC 
) AS temp, (SELECT @k := 0) AS k 
WHERE @k < 2; 

Check this SQLFiddle