2013-03-12 60 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;