2015-04-20 65 views
1

我在网站上有一个投票系统,每个用户都可以为一对用户(女性和男性)投票取胜。SQL - 统计行数,其中一列与另一列匹配(对)

投票存储在类似下面的表格中。

voter_id | voted_for | cell 
90  | 30  | f 
90  | 68  | m 
42  | 30  | f 
42  | 68  | m 
111  | 74  | f 
111  | 20  | m 
45  | 120  | f 
16  | 90  | f 
16  | 135  | m 
122  | 30  | f 
122  | 68  | m 
45  | 116  | m 
46  | 30  | m 
46  | 121  | f 

现在,我想要统计有多少用户为每一对投票。 例如“3票对30 & 68”,“1个投给对74 & 20”,“1个投给120 & 116”等等...

我有一个SQL查询,计数在voted_for提到的每个用户但是这不包括对物。它会给我4票给用户30,但用户30虽然在30对中。

SELECT voted_for, count(*) AS count 
FROM votes 
GROUP BY voted_for 
ORDER BY count desc 

回答

1

首先变换你这样的表:

| voter_id | voted_for_f | voted_for_m | 
|----------|-------------|-------------| 
|  16 |   90 |   135 | 
|  42 |   30 |   68 | 
|  45 |   120 |   116 | 
|  46 |   30 |   121 | 
|  90 |   30 |   68 | 
|  111 |   74 |   20 | 
|  122 |   30 |   68 | 

您可以使用此查询,这与自身联接表做到这一点:

SELECT f.voter_id, 
     f.voted_for AS voted_for_f, 
     m.voted_for AS voted_for_m 
FROM votes AS f 
JOIN votes AS m ON f.voter_id = m.voter_id 
       AND f.cell = 'f' 
       AND m.cell = 'm' 

然后你可以使用此查询依靠它:

SELECT f.voted_for AS voted_for_f, 
     m.voted_for AS voted_for_m, 
     COUNT(*) AS number_of_votes 
FROM votes AS f 
JOIN votes AS m ON f.voter_id = m.voter_id 
       AND f.cell = 'f' 
       AND m.cell = 'm' 
GROUP BY voted_for_f, 
     voted_for_m 
+0

非常感谢:) – iMoritz

相关问题