我所有的项目都存储在 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,但没有帮助。
最佳答案
我认为 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 - 从复杂的 MySQL 选择查询中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43506594/