子查询上的MySQL连接

子查询上的MySQL连接,mysql,sql,join,greatest-n-per-group,Mysql,Sql,Join,Greatest N Per Group,我正在尝试对子查询进行联接,尽管我无法获得所需的结果。有人能推荐一个更好的查询来运行吗?或者我不应该使用一个我对SQL的任何变体都不太熟悉的子查询,有更好的查询类型来运行吗 以我有限的SQL知识,我可以看出子查询并不是在最佳位置。这里的目标是从tblResults中查询字段,并将它们连接到tblTraceOutput中具有相同resultid的最后一行。tblTraceOutput中有多行具有相同的resultid值,因此只有最后一行 SELECT r.`resultid`, r.`succes

我正在尝试对子查询进行联接,尽管我无法获得所需的结果。有人能推荐一个更好的查询来运行吗?或者我不应该使用一个我对SQL的任何变体都不太熟悉的子查询,有更好的查询类型来运行吗

以我有限的SQL知识,我可以看出子查询并不是在最佳位置。这里的目标是从tblResults中查询字段,并将它们连接到tblTraceOutput中具有相同resultid的最后一行。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
如果我将该连接更改为左连接,我将从查询中获得更多结果,但在t.delay1、t.delay2和t.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

我想这就是你要找的。查询使用子查询分别获取表tblTraceOutput上每个resultid和resultid的最新outputid。然后,子查询的结果与表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

我想这就是你要找的。查询使用子查询分别获取表tblTraceOutput上每个resultid和resultid的最新outputid。然后,子查询的结果与表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将从tblTraceOutput表返回结果,即使没有与返回的数据为NULL匹配的结果

内部联接将仅从resultid和tblTraceOutput返回与ON子句匹配的结果

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

内部联接将仅从resultid和tblTraceOutput返回与ON子句匹配的结果

您可以使用左联接,只需在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;
可以使用左联接,只需在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;

太好了,谢谢你,先生。你今天教了我一些新东西。我已经能够对我的需求做一个小小的改变,这是完美的。我喜欢加入第二张桌子的想法!谢谢:德克塞伦,谢谢你,先生。你今天教了我一些新东西。我已经能够对我的需求做一个小小的改变,这是完美的。我喜欢加入第二张桌子的想法!谢谢:D