获取谁投票了以及每个国家获得了多少票



我需要帮助查询如何获取谁投票,有多少票给每个国家使用MySQL?

我有表voterresult,你可以在这里找到虚拟数据集https://github.com/FirzaCank/Project/blob/main/SQL/Self%20Project/Vote%20Poll/Dataset%20Dummy%20voter.sql

哪个voter表包含:

  1. ID (INT)
  2. first_name VARCHAR (10)
  3. last_name VARCHAR (10)

result表包含:

  1. voter_id (INT)
  2. 国家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;

相关内容

最新更新