不知道我是不是需要 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 或其他啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NEST 2.x 使用多字段映射语法创建索引

MySQL:在没有 JOIN 或 UNION 的情况下合并两个不同的表

在不知道 SQL 中的列的情况下创建表

我如何需要一个字段或另一个字段或(其他两个字段之一)但不是全部?

我需要帮助来验证 jwt 是不是有效或以其他方式创建一个新的,如果发送的令牌不正确,则在 nestjs 中间件中返回错误

Angular / Nest / GraphQL - 无法上传文件(400 错误请求或 500)