mysql两个表内部连接,左连接到第三个表,只有一行值最低

4xrmg8kj  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(434)

我到处找了找,找到了一个和我要找的差不多的例子,但在我的情况下不起作用。
我有一个对两个表进行内部联接的查询,这个联接实质上限制了我的整个数据集。然后我想左连接到第三个表,但我只需要第三个表中的一条记录。使用左联接的原因是,并非每个内部联接的结果在第3个表中都有匹配项。像这样:

SELECT DISTINCT t1.code, t2.id, t2.code, t3.id, t3.source_title, t3.display_order
FROM table1 t1
INNER JOIN table2 t2 ON t2.code=t1.code AND t2.type=0
LEFT JOIN table3 t3 ON t3.code=t1.code
ORDER BY t1.code, t3.display_order

此查询返回的记录太多,因为第三个表包含多个具有匹配代码的记录。我只想要与最低显示顺序值匹配的第一个,不幸的是,我不能将记录的显示顺序限制为1,因为最低显示顺序并不总是1。
重要提示:此查询返回的t3.id值(如果有)必须对应于显示顺序值最低的记录。i、 例如,如果查询正确返回最低显示顺序值,但t3.id值与表3中的其他记录相对应,则它将不起作用。
这有可能吗?任何帮助都将不胜感激。
编辑:根据尼克的建议,我试过这个,看起来很有效。我会做一些核实并报告:

SELECT DISTINCT t1.code, t2.*, sq.id, sq.source_title, sq.display_order
FROM table1 t1
INNER JOIN table2 p ON t2.code=t1.code AND t2.type=0
LEFT JOIN (
    SELECT t3.*
    FROM table3 t3
    WHERE t3.display_order=(
        SELECT MIN(display_order)
        FROM table3 t3a 
        WHERE t3a.code = t3.code
    )
) sq ON sq.code=t1.code
ORDER BY t1.code, sq.display_order
l2osamch

l2osamch1#

在mysql 8.0中,您可以尝试使用 row_number() 对于每个代码,按 display_order 在子查询中 table3 . 然后左键连接该结果并检查 row_number() 等于1。

SELECT DISTINCT
       t1.code,
       t2.id,
       t2.code,
       t3.id,
       t3.source_title,
       t3.display_order
       FROM table1 t1
            INNER JOIN table2 t2
                       ON t2.code = t1.code
            LEFT JOIN (SELECT t3.id,
                              t3.source_title,
                              t3.display_order,
                              t3.code,
                              row_number() OVER (PARTITION BY t3.code
                                                 ORDER BY t3.display_order) rn
                              FROM table3 t3) t3
                      ON t3.code = t1.code
       WHERE t2.type = 0
             AND t3.rn = 1
       ORDER BY t1.code,
                t3.display_order;

在较低版本中,您可以尝试按顺序排列的相关子查询 display_order 以及 LIMIT 1 (只得到一条记录)。

SELECT DISTINCT
       t1.code,
       t2.id,
       t2.code,
       (SELECT t3.id
               FROM table3 t3
               WHERE t3.code = t1.code
               ORDER BY t3.display_order,
                        t3.id
               LIMIT 1) id,
       (SELECT t3.source_title
               FROM table3 t3
               WHERE t3.code = t1.code
               ORDER BY t3.display_order,
                        t3.id
               LIMIT 1) source_title,
       (SELECT t3.display_order
               FROM table3 t3
               WHERE t3.code = t1.code
               ORDER BY t3.display_order,
                        t3.id
               LIMIT 1) display_order
       FROM table1 t1
            INNER JOIN table2 t2
                       ON t2.code = t1.code
       WHERE t2.type = 0
       ORDER BY t1.code,
                (SELECT t3.display_order
                        FROM table3 t3
                        WHERE t3.code = t1.code
                              ORDER BY t3.display_order,
                                       t3.id
                              LIMIT 1);

我以为 display_ordertable3 不是独一无二的但是 id 是。所以我补充说 idORDER BY 子查询中的子句,以确保在每个子查询中选择相同的记录。如果 display_order 是唯一的,你可以删除 idORDER BY 条款。
编辑:
如果不想在(总体)中重复子查询 ORDER BY 子句中,也可以按列序数排序。例如。:

...
ORDER BY 1, 6;
n53p2ov0

n53p2ov02#

你应该可以替换 table3 在你的 LEFT JOIN 具有

(SELECT * 
 FROM table3 t3 
 WHERE display_order = (SELECT MIN(display_order) 
                        FROM table3 t3a 
                        WHERE t3a.code = t3.code)
) t3

相关问题