繁体   English   中英

MySQL加入Subquery

[英]MySQL Join on Subquery

我试图在子查询上进行连接,尽管我无法得到我需要的结果。 有人可以建议更好的查询运行或者我不应该使用子查询(我不熟悉SQL的任何变体),是否有更好的查询类型运行?

我可以通过我有限的SQL知识看到子查询不在最佳位置。 这里的目标是从tblResults查询字段,并将它们连接到具有相同resultid tblTraceOutput中的最后一行(tblTraceOutput中有多个行具有相同的resultid值,因此只是最后一行)。

SELECT r.`resultid`, r.`successful`, r.`result`, r.`testdate`, r.`changed`, 
t.`delay1`, t.`delay2`, t.`delay3` 
FROM `tblResults` AS r 
JOIN (
    SELECT `resultid`, `delay1`, `delay2`, `delay3` 
    FROM `tblTraceOutput` 
    WHERE `traceid`='48'
    ORDER BY `outputid` DESC LIMIT 0,1
) AS t ON (t.`resultid` = r.`resultid`) 
WHERE r.`traceid` = '48' ORDER BY r.`resultid` DESC LIMIT 0,20

如果我将JOIN更改为LEFT JOIN我将从查询中获得更多结果,但在t.delay1t.delay2t.delay3的三列中写入“NULL”, 除了第一行之外的每一行 从子查询中提取的结果仅与tblResults上的主查询的第一行输出相关联。 如何在外部查询中为每行输出运行此子查询?

在我脑海中,我想到了以下几点,但我不能以任何方式使它工作:

SELECT r.`resultid`, r.`successful`, r.`result`, r.`testdate`, r.`changed` 
FROM `tblResults` AS r 
(
    SELECT t.`resultid`, t.`delay1`, t.`delay2`, t.`delay3` 
    FROM `tblTraceOutput` 
    WHERE `traceid`='48'
    ORDER BY `outputid` DESC LIMIT 0,1
) AS t
JOIN ON (t.`resultid` = r.`resultid`) 
WHERE r.`traceid` = '48' ORDER BY r.`resultid` DESC LIMIT 0,20
SELECT r.`resultid`, r.`successful`, r.`result`, r.`testdate`, r.`changed` 
FROM `tblResults` AS r 
LEFT JOIN `tblTraceOutput` as t ON (t.`resultid` = r.`resultid`) 
WHERE r.`traceid` = '48' ORDER BY r.`resultid` DESC LIMIT 0,20

left join将返回tblTraceOutput表的结果,即使没有匹配(返回的数据为NULL)

内连接只返回与ON子句匹配的resultid和tblTraceOutput的结果

我认为这是你正在寻找的那个。 该查询使用子查询分别得到最新outputid为每resultidresultid上表tblTraceOutput 然后,子查询的结果与表tblTraceOutput本身 )连接在一起,前提是它与子查询上的所有列匹配。 可能匹配的记录是最新记录。

SELECT  a.*, b.*
FROM    tblResults a
        INNER JOIN tblTraceOutput b
            ON a.resultid = b.resultid
        INNER JOIN
        (
            SELECT  resultid, traceid, MAX(outputid) max_ID
            FROM    tblTraceOutput
            GROUP   BY resultid, traceid
        ) c ON  b.resultid = c.resultid AND
                b.traceid = c.traceid
                b.outputid = c.max_ID
WHERE   a.traceid = 48
ORDER   BY resultid
LIMIT   0, 20

您可以使用LEFT JOIN ,只需在WHERE子句中包含一个表达式,以避免显示连接表中没有关联记录的记录:

SELECT r.`resultid`, r.`successful`, r.`result`, r.`testdate`, r.`changed`, 
t.`delay1`, t.`delay2`, t.`delay3` 
FROM `tblResults` AS r
LEFT JOIN `tblTraceOutput` AS t ON (t.`resultid` = r.`resultid`)
WHERE r.`traceid` = '48' AND t.`resultid` IS NOT NULL
ORDER BY r.`resultid` DESC
LIMIT 0, 20;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM