SQL - 计算一列与另一列匹配的行数(对)

SQL - count rows where one column matches another (pairs)

我在网站上有一个投票系统,每个用户都可以投票选出一对用户(女性和男性)获胜。

投票存储在 table 中,如下所示。

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

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

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

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

首先将你的 table 转换成这样:

| 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 |

您可以使用此查询执行此操作,该查询将 table 与其自身连接起来:

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