2010-05-27 112 views
4

我正在製作一個網站,用戶可以在哪個網頁上投票。他們可以投票表明該頁面在類別a,b,c或d中。在MySQL中計算選票的頻率

我需要從所有票中找到MySQL行中最常見的類別。

用戶每次提交投票時,都會提交投票的「類別」和「page_id」。

我有這個至今:

SELECT page_id, category 
FROM  categories 
GROUP BY page_id 

我不能使用COUNT(*) WHERE category = 'a'然後重複它爲每個類別,因爲有更多的種類在實際工程中。

+0

它可能有助於查看您正在使用的實際表結構。 – JYelton 2010-05-28 00:01:47

回答

1

如果您的表看起來是這樣的:

SELECT * from categories; 
+---------+----------+ 
| page_id | category | 
+---------+----------+ 
|  1 | a  | 
|  1 | b  | 
|  1 | a  | 
|  1 | c  | 
|  1 | a  | 
|  1 | b  | 
|  1 | a  | 
|  2 | d  | 
|  2 | d  | 
|  2 | c  | 
|  2 | d  | 
|  3 | a  | 
|  3 | b  | 
|  3 | c  | 
|  4 | c  | 
|  4 | d  | 
|  4 | c  | 
+---------+----------+ 
17 rows in set (0.00 sec) 

那麼你可能要嘗試此查詢:

SELECT c1.page_id, MAX(freq.total), 
     (
      SELECT c2.category 
      FROM  categories c2 
      WHERE c2.page_id = c1.page_id 
      GROUP BY c2.category 
      HAVING COUNT(*) = MAX(freq.total) 
      LIMIT 1 
     ) AS category 
FROM  categories c1 
JOIN  (
      SELECT page_id, category, count(*) total 
      FROM  categories 
      GROUP BY page_id, category 
     ) freq ON (freq.page_id = c1.page_id) 
GROUP BY c1.page_id; 

它返回這樣的:

+---------+-----------------+----------+ 
| page_id | MAX(freq.total) | category | 
+---------+-----------------+----------+ 
|  1 |    4 | a  | 
|  2 |    3 | d  | 
|  3 |    1 | a  | 
|  4 |    2 | c  | 
+---------+-----------------+----------+ 
4 rows in set (0.00 sec) 

比較結果與實際頻率分佈:

SELECT page_id, category, COUNT(*) FROM categories GROUP BY page_id, category; 
+---------+----------+----------+ 
| page_id | category | COUNT(*) | 
+---------+----------+----------+ 
|  1 | a  |  4 | 
|  1 | b  |  2 | 
|  1 | c  |  1 | 
|  2 | c  |  1 | 
|  2 | d  |  3 | 
|  3 | a  |  1 | 
|  3 | b  |  1 | 
|  3 | c  |  1 | 
|  4 | c  |  2 | 
|  4 | d  |  1 | 
+---------+----------+----------+ 
10 rows in set (0.00 sec) 

請注意,對於page_id = 3,沒有主導頻率,在這種情況下,此查詢無法保證在這種情況下將選擇哪個類別。

1

SELECT category, page_id, count(vote_id) 
FROM categories 
WHERE category in ('a', 'b', 'c', 'd') 
GROUP BY category, page_id 
ORDER BY count(vote_id) DESC 
LIMIT 1 

應該做的伎倆。我在這裏假設每票投票分別存儲在一個單獨的行中。

它只會出現在您感興趣的cqtegory中,並以最多的票數排序並僅返回第一個。