子查询上的MySQL连接
我正在尝试对子查询进行联接,尽管我无法获得所需的结果。有人能推荐一个更好的查询来运行吗?或者我不应该使用一个我对SQL的任何变体都不太熟悉的子查询,有更好的查询类型来运行吗 以我有限的SQL知识,我可以看出子查询并不是在最佳位置。这里的目标是从tblResults中查询字段,并将它们连接到tblTraceOutput中具有相同resultid的最后一行。tblTraceOutput中有多行具有相同的resultid值,因此只有最后一行子查询上的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
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