我需要帮助查询如何获取谁投票,有多少票给每个国家使用MySQL?
我有表voter
和result
,你可以在这里找到虚拟数据集https://github.com/FirzaCank/Project/blob/main/SQL/Self%20Project/Vote%20Poll/Dataset%20Dummy%20voter.sql
哪个voter
表包含:
- ID (INT)
- first_name VARCHAR (10)
- last_name VARCHAR (10)
和result
表包含:
- voter_id (INT)
- 国家VARCHAR (10)
我已经尝试了MySQL查询如下:
SELECT
country,
CONCAT(v.first_name,' ',v.last_name,' x ',COUNT(r.voter_id)) AS votes
FROM voter v
RIGHT JOIN result r ON v.id = r.voter_id
GROUP BY country;
但是我得到了一个错误,我确信这个问题需要循环之类的东西,但我真的不明白那些东西
期望的输出将是这样的,但就我在上面的语法中所尝试的那样,它只是输出了我的输出,我不能显示同一国家的所有选民,我只是每1个国家显示1个选民。
SELECT
country,
group_concat(votes,',') as votes
FROM
(
SELECT
country,
CONCAT(v.first_name,' ',v.last_name,' x ',COUNT(r.voter_id)) AS votes
FROM voter v
RIGHT JOIN result r ON v.id = r.voter_id
GROUP BY country,first_name,last_name
) x
GROUP BY country;
看到:DBFIDDLE
首先你的查询给出了一个错误。这一个:
"SELECT列表不在GROUP BY子句中并且包含非聚合列"……First_name ',没有功能依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by"
这个错误,以及如何处理它,解释如下:
这意味着所有未在聚合函数中使用的字段,您将在GROUP BY中提到。
因为您希望输出中每个国家只包含一行,所以在结果中添加了GROUP_CONCAT函数。
另一种方法(对于大数据可能更优一点,因为聚合发生在单个表上):
select country, group_concat(concat(first_name, ' ', last_name, ' x ', c) order by c desc)
from (
select country, voter_id, count(*) c
from result
group by country, voter_id
) x
join voter on id = voter_id
group by country;