2013-03-12 64 views
1

我试图在子查询上创建联接,虽然我无法获得我需要的结果。有人可以建议更好的查询来运行,或者我不应该使用子查询(我不熟悉SQL的任何变体),有没有更好的查询类型来运行?MySQL在子查询上加入

我可以看到我有限的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 

如果我改变JOINLEFT 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 

回答

1

我觉得这是你要找的人。查询使用子查询分别获取表tblTraceOutput上的每个resultidresultid的最新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 
+1

非常好,谢谢先生。你今天教了我一些新东西。我已经能够对自己的需求做出微小的改变,而且这是完美的。我喜欢将第二张桌子加入自己的想法!谢谢:D – jwbensley 2013-03-12 17:36:21

+0

不用客气':D'很高兴帮助。 – 2013-03-12 17:37:13

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)

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

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;