Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从复杂的MySQL选择查询中删除重复项_Php_Mysql_Sql - Fatal编程技术网

Php 从复杂的MySQL选择查询中删除重复项

Php 从复杂的MySQL选择查询中删除重复项,php,mysql,sql,Php,Mysql,Sql,我的所有项目都存储在com_projects表中。每个项目可以有多个位置,这些位置存储在com_位置表中。com_country表只是一个国家名称列表,com_location表使用该列表输入国家名称 在com_项目表中,我有一个category_id字段,其值可以是1-4 下面的SELECT查询是我尝试计算每个国家/地区分配类别的总次数 --------------------------------------------------------------- | country | cat

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

在com_项目表中,我有一个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,但没有起到任何作用。

我认为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;

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

在本例中,数据表示问题应在应用程序级代码PHP中处理。它更具可扩展性和灵活性,任何其他建议都是愚蠢的。哦,下一次,请看@草莓。目前还不清楚PHP将如何重新计算聚合值以使其正确。如果你有一个解决方案,你应该把它作为一个答案发布出来。因为正如Gordon所指出的,我是在查询中聚合结果的,所以它需要在查询本身中进行处理。请看,虽然没有错误,但鉴于OP可以随时访问PHP,这是一个糟糕的解决方案。