1

尽管我无法获得所需的结果,但我正在尝试对子查询进行连接。有人可以建议运行更好的查询,或者我不应该使用子查询(我不精通 SQL 的任何变体),是否有更好的查询类型可以运行?

以我有限的 SQL 知识,我可以看到子查询不在最佳位置。这里的目标是从 tblResults 中查询字段,并将它们连接到tblTraceOutput 中具有相同值的最后一行(tblTraceOutputresultid中有多行具有相同的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为 aLEFT JOIN我将从我的查询中获得更多结果,但在除第一行之外的每一行中的三列t.delay1中写入 'NULL't.delay2和。从子查询中提取的结果仅与 tblResults 上主查询的第一行输出联合。我怎样才能让这个子查询为外部查询中的每一行输出运行和联合?t.delay3

在我的脑海中,我想象以下内容,但我无法以任何方式使其工作:

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
4

3 回答 3

2
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 的结果

于 2013-03-12T17:23:03.787 回答
1

您可以使用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;
于 2013-03-12T17:24:13.630 回答
1

我想这就是你正在寻找的那个。该查询使用子查询分别获取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
于 2013-03-12T17:21:59.283 回答