SQL查询不断显示重复项

时间:2018-06-14 10:28:11

标签: mysql sql mysqli

我有一张包含国家,地区和不同尺寸的表格。我试图为所有相等的区域总结一个特定的列,然后为每个国家显示它们。问题是,国家/地区在我的表格中不止一次出现,因为另一列是"消费类别"。

现在我的查询是:

SELECT main.country, main.region, (SELECT SUM(sec.share) 
FROM data_xlsx_Hoja2 sec 
WHERE sec.region = main.region AND sec.segment="lowest" AND sec.category="food") as total 
FROM data_xlsx_Hoja2 main

结果如下:

+ --------+-------------------------+-------------------+
| country | region                  | total             |
+ --------+-------------------------+-------------------+
| Albania | Europe and Central Asia | 8.152791917324066 |
| Albania | Europe and Central Asia | 8.152791917324066 |
| Albania | Europe and Central Asia | 8.152791917324066 |
| Albania | Europe and Central Asia | 8.152791917324066 |
| Albania | Europe and Central Asia | 8.152791917324066 |
| Albania | Europe and Central Asia | 8.152791917324066 |
| Albania | Europe and Central Asia | 8.152791917324066 |
| Albania | Europe and Central Asia | 8.152791917324066 |
| Albania | Europe and Central Asia | 8.152791917324066 |
+ --------+-------------------------+-------------------+

我需要我的查询来显示每个国家只有一个,但是已经显示查询的数字....我试图使用GROUP BY和SELECT DISTINCT,但查询只是继续加载,从不显示结果。该表有大约30000行。

有什么想法吗? 感谢!!!

3 个答案:

答案 0 :(得分:1)

我的第一个观察是:你真的想要按地区或国家分享份额吗?这更有意义,看起来像这样:

SELECT h.region, h.country, SUM(h.share) 
FROM data_xlsx_Hoja2 h 
WHERE h.segment = 'lowest' AND h.category = 'food'
GROUP BY h.region, h.country;

如果您希望每个国家/地区地区总和,则需要获取国家/地区列表。像这样:

SELECT rc.*, r.region_share
FROM (SELECT DISTINCT h.region, h.country
      FROM data_xlsx_Hoja2 h 
     ) rc LEFT JOIN
     (SELECT h.region, SUM(h.share) as region_share
      FROM data_xlsx_Hoja2 h 
      WHERE h.segment = 'lowest' AND h.category = 'food'
      GROUP BY h.region
     ) r
     ON rc.region = r.region;

答案 1 :(得分:0)

试试这个,因为我理解你的问题,你需要这个

SELECT country, region, SUM(share) as total 
FROM data_xlsx_Hoja2 sec WHERE sec.segment="lowest" AND sec.category="food"
group by country, region

请澄清您的问题,以便我们给出正确的答案

答案 2 :(得分:0)

可以预期国家/地区表和区域表。因此,我们必须首先从您的数据表创建一个国家/地区表:

select distinct country from data_xlsx_hoja2;

然后你想要每个地区的份额总和:

select region, sum(share) from data_xlsx_hoja2 group by region;

现在您想要将国家/地区加入其所在地区,但是oops ...在您的数据模型中,一个国家/地区可以属于不同的地区,因为没有国家/地区表格,每个国家/地区都有一条记录,每个国家/地区都有一个区域ID。同一个国家/地区可以data_xlsx_hoja2显示在不同的地区。好吧,它甚至可以显得多种多样('阿尔巴尼亚','阿尔巴尼亚','阿尔巴尼亚共和国',......)现在是时候规范数据库了。

我们可以做的是在桌子上欺骗自己,生成一个包含区域的国家/地区表格:

select country, any_value(region) from data_xlsx_hoja2 group by country;

完整的查询:

select c.country, r.total_share
from (select country, min(region) as region from data_xlsx_hoja2 group by country) c
join (select region, sum(share) as total_share from data_xlsx_hoja2 group by region) r
  using (region)
order by c.country;

将您的条件(segment = 'lowest' AND category = 'food')放在适当的位置。您是否只想显示具有匹配记录的国家/地区?或者你只是想从区域总和中排除这些记录?

无论如何,你应该真正修复你的数据模型:

  • 表区域(region_id,region_name)
  • 表国家/地区(country_id,country_name,region_id)
  • table data_xlsx_hoja2(data_xlsx_hoja2_id,country_id,share)