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
我在网站上有一个投票系统,每个用户都可以投票选出一对用户(女性和男性)获胜。
投票存储在 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