【问题标题】:How to limit a left join to only 1 row? Without subquery?如何将左连接限制为仅 1 行?没有子查询?
【发布时间】:2021-09-26 16:51:24
【问题描述】:

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

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 行。
有没有办法做到这一点?

【问题讨论】:

    标签: mysql join left-join


    【解决方案1】:

    当排序正确时添加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
    

    【讨论】:

    • 我将此查询放在 PHP 中的 while 循环中,它将查询任何符合条件的结果。通过限制 1,会不会停止执行 while 循环并且只返回 1 个结果?
    • while 循环不是 mysql 的范围,每个循环 wpuld 返回 1 个结果,并且无法停止 php 循环
    • 我刚刚测试了应该查询 3 行但只查询了 1 行的查询。我只需要限制连接的行,而不是整个查询。联接返回 2 行,因为该条件有 2 个匹配项,如何在继续查询的同时只获得 1 个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2012-07-10
    • 2023-03-02
    • 2010-10-04
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多