【问题标题】:Removing Duplicates from complex MySQL Select Query从复杂的 MySQL 选择查询中删除重复项
【发布时间】:2017-09-16 07:47:17
【问题描述】:

我所有的项目都存储在 com_projects 表中。每个项目可以有多个位置,这些位置存储在 com_location 表中。 com_country 表只是一个国家名称列表,com_location 表使用它来提取国家名称。

在 com_project 表中,我有一个 category_id 字段,它的值可以是 1-4。

下面的 SELECT 查询是我尝试计算每个国家/地区分配类别的总次数。

---------------------------------------------------------------
| country | category_1 | category_2 | category_3 | category_4 |
---------------------------------------------------------------
| USA     |     20     |      5     |     3      |     0      |
---------------------------------------------------------------
| UK      |     1      |      12    |     0      |     0      |

等等……

SELECT b.country_id, c.name,
SUM(case when a.category_id = 1 then 1 else 0 end) as category_1,
SUM(case when a.category_id = 2 then 1 else 0 end) as category_2,
SUM(case when a.category_id = 3 then 1 else 0 end) as category_3,
SUM(case when a.category_id = 4 then 1 else 0 end) as category_4
FROM com_project a
Inner JOIN com_location b 
ON a.id = b.project_id
INNER JOIN com_country c
ON c.id = b.country_id
WHERE a.state = 1
AND b.state = 1
GROUP BY b.country_id

如果项目在不同国家/地区有一个或多个位置,我只希望增加一个类别。我遇到的问题是,许多项目在同一个国家有多个位置,并且人为地增加了结果。

如何调整我的 SELECT 语句以防止来自同一国家/地区的重复?

顺便说一句,我尝试在 SELECT 之后立即添加 DISTINCT,但没有帮助。

【问题讨论】:

  • 数据表示问题应在应用程序级代码(本例中为 PHP)中处理。它更具可扩展性和灵活性,坦率地说,任何其他建议都是愚蠢的。哦,下次见meta.stackoverflow.com/questions/333952/…
  • @Strawberry 。 . .尚不清楚 PHP 将如何重新计算正确的聚合值。如果您有解决方案,您应该将其作为答案发布。
  • @Strawberry 它需要在查询本身中进行处理,因为正如 Gordon 指出的那样,我在查询中汇总结果。

标签: php mysql sql


【解决方案1】:

我认为where 子句可以过滤掉始终在一个国家/地区的项目:

SELECT l.country_id, c.name,
       SUM(p.category_id = 1) as category_1,
       SUM(p.category_id = 2) as category_2,
       SUM(p.category_id = 3) as category_3,
       SUM(p.category_id = 4) as category_4
FROM com_project p Inner JOIN
     com_location l
     ON p.id = l.project_id INNER JOIN
     com_country c
     ON c.id = l.country_id
WHERE p.state = 1 AND l.state = 1 AND
      EXISTS (SELECT 1
              FROM com_location l2
              WHERE l2.project_id = l.project_id AND l2.country <> l.country
             )
GROUP BY l.country_id, c.name;

这只是检查每个正在聚合的项目是否至少有一个其他国家/地区。

【讨论】:

  • 虽然没有错误,但鉴于 OP 可以随时访问 PHP,这仍然是一个糟糕的解决方案。
猜你喜欢
  • 2017-07-11
  • 1970-01-01
  • 2013-03-16
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
相关资源
最近更新 更多