因此,目前我的查询显示了基于该大陆的国家/地区的所有“首选”旅行目的地的结果,并且我添加了一个having 子句来显示具有超过 1 个首选目的地的大陆。但是当我添加更多想要显示的列(比如说城市)时,我的查询什么也没有返回。
这是有效的查询,它显示有超过 2 个首选国家作为旅行目的地的所有大洲(首选标志是 Y)。
select d.continent,d.country_name,di.is_preferred, count(1)
from continent c, countries ct
where c.cid = ct.id
and ct.preferred = Y
group by d.continent,d.country_name,ct.is_preferred
having count(1) > 1
order by d.country_name asc;`
假设我想要显示相同的结果,但我想显示该大陆有超过 1 个首选国家/地区的国家/地区的所有城市列表。城市列来自C洲表,我一添加到having语句中,结果就是空白?
我做错了什么?
这是我修改后的查询:
select d.continent,d.country_name,di.is_preferred, c.cities, count(1)
from continent c, countries ct
where c.cid = ct.id
and ct.preferred = Y
group by d.continent,d.country_name,ct.is_preferred, c.cities
having count(1) > 1
order by d.country_name asc;
我尝试修改我的查询,但结果中没有任何结果
您在 SQL 查询中遇到的问题是由
GROUP BY
子句及其与 HAVING
子句的交互引起的。 GROUP BY
子句定义数据的聚合方式,并且 HAVING
子句过滤这些组。当您将具有高粒度级别的列(例如 cities
)添加到 GROUP BY
子句时,它会更改数据的分组方式,可能会创建许多小组,每个小组可能不满足 HAVING
计数条件.
在原始查询中,您按
continent
、country_name
和 is_preferred
进行分组,这为您提供了每个大陆内的国家/地区组。当您将 cities
添加到此分组时,它会将这些组进一步细分为各个城市,可能会导致每个组的计数为 1,因此不满足 HAVING count(1) > 1
条件。
要实现列出具有多个首选国家/地区的大洲城市的目标,您可以使用子查询。这是一个方法:
以下是修改查询的方法:
SELECT c.continent, ct.country_name, ct.is_preferred, c.cities
FROM continent c
JOIN countries ct ON c.cid = ct.id
WHERE ct.is_preferred = 'Y'
AND c.continent IN (
SELECT d.continent
FROM continent d
JOIN countries di ON d.cid = di.id
WHERE di.is_preferred = 'Y'
GROUP BY d.continent
HAVING COUNT(DISTINCT di.country_name) > 1
)
ORDER BY ct.country_name ASC;
说明:
WHERE
子句中的子查询选择具有多个首选国家/地区的大陆。JOIN
用于根据国家/地区 ID 链接 continent
和 countries
表。ct.preferred = Y
更改为 ct.is_preferred = 'Y'
,假设 is_preferred
是正确的列名称,“Y”是字符串值。此查询应返回具有多个首选国家/地区的大洲城市列表,以及相关国家/地区和大洲的详细信息。