从“ x”表返回前“ n”个值并进行联接的方法

问题描述

我正在尝试编写一个查询,该查询返回每个表的前3个值,然后在它们的共享年份将这些表连接在一起。

SELECT los_ty_year AS `year`,`los_ty_#_nights`,los_ty_nights_frequency,reg_ty_region,reg_ty_region_frequency

FROM  ( SELECT los_ty_year,los_ty_nights_frequency
        FROM ty_jp_kr_length_of_stay
        WHERE los_ty_year = 2017
        ORDER BY los_ty_nights_frequency desc
        LIMIT 3) T1

JOIN (
        SELECT reg_ty_year,reg_ty_region_frequency
        FROM ty_jp_kr_region_residence
        WHERE reg_ty_year = 2017
        ORDER BY reg_ty_region_frequency DESC
        LIMIT 3 ) T2
        
ON T1.los_ty_year = T2.reg_ty_year
LIMIT 3

预期产量

year   los_ty_#_nights   los_ty_nights_freq   reg_ty_region   reg_ty_region_freq
2017   2_nights          .333                 south           .256
2017   3_nights          .244                 southwest       .195
2017   1_night           .215                 west            .137

我的问题是,无论我如何订购,我总是会重复获取其中一列。

解决方法

当前联接逻辑的主要问题是两个子查询中的所有3条顶级记录都共享同一年2017。这意味着您的联接实际上是交叉联接,并且应产生结果集有9条记录。使用MySQL 8+,我们可以使用ROW_NUMBER处理此问题:

WITH cte1 AS (
    SELECT los_ty_year,`los_ty_#_nights`,los_ty_nights_frequency,ROW_NUMBER() OVER (ORDER BY los_ty_nights_frequency DESC) rn
    FROM ty_jp_kr_length_of_stay
    WHERE los_ty_year = 2017
),cte2 AS (
    SELECT reg_ty_year,reg_ty_region,reg_ty_region_frequency,ROW_NUMBER() OVER (ORDER BY reg_ty_region_frequency DESC) rn
    FROM ty_jp_kr_region_residence
    WHERE reg_ty_year = 2017
)

SELECT
    t1.los_ty_year AS year,t1.`los_ty_#_nights`,t1.los_ty_nights_frequency,t2.reg_ty_region,t2.reg_ty_region_frequency
FROM cte1 t1
INNER JOIN cte2 t2
    ON t1.rn = t2.rn
ORDER BY
    t1.rn;

请注意,这里我们将第一个子查询(实际上是CTE)中的“第一”记录连接到第二个子查询中的“第一”记录,依此类推。

,

考虑到3条记录具有相同的年份输入,您不能仅在年份列上加入。因为您正在创建多对多关系,所以您获得了3x3记录。您实际上要在此处执行的操作是合并列。正如Tim所建议的,您可以使用ROW_NUMBER为每个表创建唯一的ID,并将它们加入每个ID。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...