首页 > 解决方案 > 如何将左连接限制为仅 1 行?没有子查询?

问题描述

我看过几个例子,但它们都使用子查询。我没有使用子查询。

ECLD(e)             ECLD_REJECTIONS(er)
 id |            id | ecld_id | role | for
 1  |            1  |    1    |   4  |  3
 2  |            2  |    1    |   5  |  3

SELECT 
e.id,
er.id,er.role
FROM ecld e
LEFT JOIN ecld_rejections er ON e.id = er.ecld_id AND er.for = '3'
WHERE e.project_no='5' OR e.project_no='4' ORDER BY er.id DESC

期望的结果是
1,2,5
目前得到
1,2,5
1,1,4
我必须只得到具有最高 id 的行,因此我的排序。我的查询成功查询了 id 2,然后是 1,但我怎样才能只返回 1 行?我不能放置“限制 1”,因为我需要查询多个匹配项,但只想在连接上返回 1 行。
有没有办法做到这一点?

标签: mysqljoinleft-join

解决方案


添加一个LIMIT 1,当排序正确时

SELECT 
e.id,
er.id,er.role
FROM ecld e
LEFT JOIN ecld_rejections er ON e.id = er.ecld_id AND er.for = '3'
WHERE e.project_no='5' 
ORDER BY er.id DESC
LIMIT 1

这只会让你获得第一行

当您只希望加入的给您一行时,您可以

SELECT 
e.id,
er.id,er.role
FROM ecld e
LEFT JOIN (SELECT id,ecld_id,role FROM ecld_rejections WHERE `for` = '3' ORDER BY id DESC LIMIT 1) er ON e.id = er.ecld_id 
WHERE e.project_no='5' 
ORDER BY er.id DESC

对于多个 eC_id id,您需要一个行号

SELECT 
e.id,
er.id,er.role
FROM ecld e
LEFT JOIN (SELECT id,ecld_id,role, ROW_NUMBER() OVER(PARTITION BY ecld_id ORDER BY id DESC) rn  FROM ecld_rejections WHERE `for` = '3' ) er ON e.id = er.ecld_id 
WHERE e.project_no='5' and rn = 1

推荐阅读