问题描述
我正在尝试编写一个查询,该查询返回每个表的前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。