2010-07-15 23 views
4

我正在尋找一種方法來選擇最常出現的值,例如,每個線程發佈最多的人;在MySQL中選擇最常出現的值

SELECT MOST_OCCURRING(user_id) FROM thread_posts GROUP BY thread_id 

有沒有一種很好的方法來做到這一點?

+0

你想要一個列表,每個線程與相關的頂部發布用戶一行? – 2010-07-15 15:26:54

+0

@Michael,那是對的。 – Aistina 2010-07-15 15:43:17

回答

8

如果你想在每個線程的基礎上計數,我認爲你可以使用嵌套查詢;按線程先分組,然後按用戶分組:

SELECT thread_id AS tid, 
    (SELECT user_id FROM thread_posts 
     WHERE thread_id = tid 
     GROUP BY user_id 
     ORDER BY COUNT(*) DESC 
     LIMIT 0,1) AS topUser 
FROM thread_posts 
GROUP BY thread_id 
+0

+1,我看到你的觀點 – Unreason 2010-07-15 15:30:48

2

如果您在「每個組最多的n個」標籤下檢查問題,有很多示例。但在這種情況下,您並未定義您想如何處理關係 - 如果兩個或更多用戶具有相同的計數值,該怎麼辦?

SELECT DISTINCT 
     tp.thread_id, 
     tp.user_id 
    FROM THREAD_POSTS tp 
    JOIN (SELECT t.thread_id, 
       t.user_id, 
       COUNT(t.user_id) AS occurrence, 
       CASE 
       WHEN @thread != t.thread_id THEN @rownum := 1 
       ELSE @rownum := @rownum + 1 
       END AS rank, 
       @thread := t.thread_id 
      FROM THREAD_POSTS t 
      JOIN (SELECT @rownum := 0, @thread := -1) r 
     GROUP BY t.thread_id, t.user_id 
     ORDER BY t.thread_id, occurrence DESC) x ON x.thread_id = tp.thread_id 
               AND x.user_id = tp.user_id 
               AND x.rank = 1 
3

這將製表USER_ID的出現每線程

SELECT thread_id, user_id, COUNT(*) as postings 
FROM thread_posts 
GROUP BY thread_id, user_id 

但你只是想選擇頂級用戶爲每個線程

SELECT thread_id, user_id, postings 
FROM (
    SELECT thread_id, user_id, COUNT(*) as postings 
    FROM thread_posts 
    GROUP BY thread_id, user_id 
) 
HAVING postings = max(postings) 

這相當於

SELECT thread_id, user_id, COUNT(*) as postings 
FROM thread_posts 
GROUP BY thread_id, user_id 
HAVING postings = max(postings) 

HAVING keywor d通常與聚合操作一起使用,以挑選滿足HAVING子句中條件的聚合輸出行。

HAVING子句與WHERE子句不同,其中HAVING子句過濾查詢的結果輸出。而WHERE子句會過濾查詢的輸入數據。 由於HAVING子句過濾查詢的結果輸出,因此它必須出現在ORDER BY和GROUP BY子句之後。

+2

不工作。運行這個查詢給出一個空的輸出。沒有什麼是從MySQL返回的。 – 2015-07-30 20:27:42