我正在尝试在子查询上进行连接,尽管我无法得到我需要的结果。有人可以建议更好的查询运行,或者我不应该使用子查询(我不熟悉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
如果我将JOIN
更改为LEFT JOIN
我将从查询中获得更多结果,但在t.delay1
的三列中写有'NULL',t.delay2
除了第一个之外的每一行都有t.delay3
,。从子查询中提取的结果仅与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
答案 0 :(得分: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
左连接将返回tblTraceOutput表的结果,即使没有匹配(返回的数据为NULL)
内连接只返回与ON子句匹配的resultid和tblTraceOutput的结果
答案 1 :(得分:1)
我认为这是你正在寻找的那个。该查询使用子查询分别获取表outputid
上每个resultid
和resultid
的最新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
答案 2 :(得分: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;