不知道我是不是需要 NEST 或 JOIN 或其他啥?
Posted
技术标签:
【中文标题】不知道我是不是需要 NEST 或 JOIN 或其他啥?【英文标题】:Can't figure out whether I need to NEST or JOIN or something else?不知道我是否需要 NEST 或 JOIN 或其他什么? 【发布时间】:2019-07-17 11:58:14 【问题描述】:我有 3 张桌子 - 大陆、国家/地区信息和航班。
我想运行一个查询,通过计算历史上预订 0 次航班的国家/地区数量,按 DESC 顺序对各大洲进行排名。但显示大洲名称而不是其 id
大陆表 - cont_id (P-KEY)、名称 varchar、注释 varchar
国家表-cntry_id(P-KEY),名称varchar,缩写varchar
航班信息表 - cntry_id int、cont_id int、航班浮动、日期日期
我在 Metabase 上做,到目前为止,我已经设法让它做所有事情,除了显示大陆名称,它只显示它的 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,我只需要一行代码,让它从大洲表中运行查找并给我与 id 匹配的名称(我只希望名称不显示 ID)
【问题讨论】:
提示:INNER JOIN
.
【参考方案1】:
因此,简单的答案是获取您的查询,稍微重新格式化,然后将INNER JOIN
添加到大陆表。这样的事情可能会起作用:
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;
这是如何工作的?好吧,它从大陆表开始,然后将其链接到国家/地区,以获取每个大陆的国家/地区列表。然后它对航班表执行LEFT JOIN
,因此即使没有航班数据它也会得到命中。最后,它会计算航班值等于或小于 0 或根本没有航班数据的国家/地区的数量。
即使这可能也不正确,就好像您有两行代表一个国家(我将假设航班表有一行代表每个大陆、国家、日期),其中一个航班的航班 = 0 和一个有航班 = 10,那么这仍然会报告该国家/地区没有航班。但现在我离最初的问题太远了……
【讨论】:
【参考方案2】:您可以使用联接或子查询来执行此操作
使用连接
您只需要加入基于 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
使用子查询
您可以编写另一个查询,通过匹配 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
【讨论】:
以上是关于不知道我是不是需要 NEST 或 JOIN 或其他啥?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL:在没有 JOIN 或 UNION 的情况下合并两个不同的表
我如何需要一个字段或另一个字段或(其他两个字段之一)但不是全部?
我需要帮助来验证 jwt 是不是有效或以其他方式创建一个新的,如果发送的令牌不正确,则在 nestjs 中间件中返回错误