无法弄清楚我是否需要 NEST 或 JOIN 或其他什么?
Can't figure out whether I need to NEST or JOIN or something else?
我有 3 tables - 大洲、国家/地区信息和航班。
我想 运行 一个查询,该查询通过计算历史上预订了 0 次航班的国家/地区的数量,按 DESC 顺序对各大洲进行排名。但显示大陆名称而不是它的 id
大洲 table - cont_id (P-KEY),名称 varchar,注释 varchar
国家table - cntry_id (P-KEY),名称varchar,缩写varchar
航班信息 table - cntry_id 整数,cont_id 整数,航班浮动,日期日期
我正在元数据库上进行操作,到目前为止,我已经设法让它完成所有工作,但只显示大陆名称,它只显示其 ID。我尝试嵌套主查询并尝试使用连接,但都没有用
SELECT "public"."flights_info"."cont_id", count(*) AS "count"
FROM "public"."flights_info"
WHERE "public"."flights_info"."flights" <= 0
GROUP BY "public"."flights_info"."cont_id"
ORDER BY "count" DESC
我已成功获得 cont_id,我只需要一行代码即可 运行 从各大洲进行查找 table 并给我匹配的名称id(我只想显示名称而不是 ID)
所以简单的答案是接受您的查询,稍微重新设置格式,然后将 INNER JOIN
添加到大陆 table。像这样的东西可能会起作用:
SELECT
c.[name] AS continent_name,
COUNT(*) AS [count]
FROM
[public].flights_info f
INNER JOIN [public].continents c ON c.cont_id = f.cont_id
WHERE
f.flights <= 0
GROUP BY
c.[name]
ORDER BY
2 DESC;
但是,我不相信您最初的查询是正确的。你说你想统计每个大洲历史上没有预订航班的国家的数量,我认为这根本不是你要统计的。相反,您要计算航班值为 0 或小于零的每个大陆的行数。现在也许这实际上就是您的数据库的工作方式,如果是这样那就太酷了,上面的查询应该会让您走上正轨。
但是,如果这个数据库像我认为的那样工作,那么您将需要一个非常不同的查询,例如这个:
SELECT
c.[name] AS continent_name,
COUNT(DISTINCT cn.cntry_id) AS [count]
FROM
[public].continents c
INNER JOIN [public].country cn ON cn.cont_id = c.cont_id
LEFT JOIN [public].flights_info f ON f.cont_id = c.cont_id AND f.cntry_id = cn.cntry_id
WHERE
ISNULL(f.flights, 0) <= 0
GROUP BY
c.[name]
ORDER BY
2 DESC;
这是如何工作的?好吧,它从大陆 table 开始,然后将其链接到国家/地区,以获取每个大陆的国家/地区列表。然后它对航班 table 执行 LEFT JOIN
,因此即使没有航班数据也会被命中。最后,它会计算出航班值为 0 或更小,或者根本没有航班数据的国家/地区数量。
即使这可能也不正确,就好像你有两行代表一个国家(我假设航班 table 有一行代表每个大陆、国家、日期),其中一个有一个航班 = 0 和一个航班 = 10,那么这仍然会报告该国家/地区没有航班。但是现在我感觉离原来的问题太远了...
You can use join or sub-query to do this
使用 JOIN
您只需要加入基于大陆 table 的 cont_id 列并获取大陆名称。
select Continents.name, count(*) AS "count"
FROM flights_info flights_info
join Continents Continents
on Continents.cont_id = flights_info.cont_id
WHERE flights_info.flights <= 0
GROUP BY flights_info.cont_id,Continents.name
ORDER BY "count" DESC
使用Sub-Query
您可以编写另一个查询,通过匹配 cont_id.
为您提供大陆名称
select (select Continents.name from Continents Continents where Continents.cont_id =
flights_info.cont_id ) Continent_name, count(*) AS "count"
FROM flights_info flights_info
WHERE flights_info.flights <= 0
GROUP BY flights_info.cont_id
ORDER BY "count" DESC
我有 3 tables - 大洲、国家/地区信息和航班。
我想 运行 一个查询,该查询通过计算历史上预订了 0 次航班的国家/地区的数量,按 DESC 顺序对各大洲进行排名。但显示大陆名称而不是它的 id
大洲 table - cont_id (P-KEY),名称 varchar,注释 varchar
国家table - cntry_id (P-KEY),名称varchar,缩写varchar
航班信息 table - cntry_id 整数,cont_id 整数,航班浮动,日期日期
我正在元数据库上进行操作,到目前为止,我已经设法让它完成所有工作,但只显示大陆名称,它只显示其 ID。我尝试嵌套主查询并尝试使用连接,但都没有用
SELECT "public"."flights_info"."cont_id", count(*) AS "count"
FROM "public"."flights_info"
WHERE "public"."flights_info"."flights" <= 0
GROUP BY "public"."flights_info"."cont_id"
ORDER BY "count" DESC
我已成功获得 cont_id,我只需要一行代码即可 运行 从各大洲进行查找 table 并给我匹配的名称id(我只想显示名称而不是 ID)
所以简单的答案是接受您的查询,稍微重新设置格式,然后将 INNER JOIN
添加到大陆 table。像这样的东西可能会起作用:
SELECT
c.[name] AS continent_name,
COUNT(*) AS [count]
FROM
[public].flights_info f
INNER JOIN [public].continents c ON c.cont_id = f.cont_id
WHERE
f.flights <= 0
GROUP BY
c.[name]
ORDER BY
2 DESC;
但是,我不相信您最初的查询是正确的。你说你想统计每个大洲历史上没有预订航班的国家的数量,我认为这根本不是你要统计的。相反,您要计算航班值为 0 或小于零的每个大陆的行数。现在也许这实际上就是您的数据库的工作方式,如果是这样那就太酷了,上面的查询应该会让您走上正轨。
但是,如果这个数据库像我认为的那样工作,那么您将需要一个非常不同的查询,例如这个:
SELECT
c.[name] AS continent_name,
COUNT(DISTINCT cn.cntry_id) AS [count]
FROM
[public].continents c
INNER JOIN [public].country cn ON cn.cont_id = c.cont_id
LEFT JOIN [public].flights_info f ON f.cont_id = c.cont_id AND f.cntry_id = cn.cntry_id
WHERE
ISNULL(f.flights, 0) <= 0
GROUP BY
c.[name]
ORDER BY
2 DESC;
这是如何工作的?好吧,它从大陆 table 开始,然后将其链接到国家/地区,以获取每个大陆的国家/地区列表。然后它对航班 table 执行 LEFT JOIN
,因此即使没有航班数据也会被命中。最后,它会计算出航班值为 0 或更小,或者根本没有航班数据的国家/地区数量。
即使这可能也不正确,就好像你有两行代表一个国家(我假设航班 table 有一行代表每个大陆、国家、日期),其中一个有一个航班 = 0 和一个航班 = 10,那么这仍然会报告该国家/地区没有航班。但是现在我感觉离原来的问题太远了...
You can use join or sub-query to do this
使用 JOIN
您只需要加入基于大陆 table 的 cont_id 列并获取大陆名称。
select Continents.name, count(*) AS "count"
FROM flights_info flights_info
join Continents Continents
on Continents.cont_id = flights_info.cont_id
WHERE flights_info.flights <= 0
GROUP BY flights_info.cont_id,Continents.name
ORDER BY "count" DESC
使用Sub-Query
您可以编写另一个查询,通过匹配 cont_id.
为您提供大陆名称select (select Continents.name from Continents Continents where Continents.cont_id =
flights_info.cont_id ) Continent_name, count(*) AS "count"
FROM flights_info flights_info
WHERE flights_info.flights <= 0
GROUP BY flights_info.cont_id
ORDER BY "count" DESC