[英]MySQL Join on Subquery
我試圖在子查詢上進行連接,盡管我無法得到我需要的結果。 有人可以建議更好的查詢運行或者我不應該使用子查詢(我不熟悉SQL的任何變體),是否有更好的查詢類型運行?
我可以通過我有限的SQL知識看到子查詢不在最佳位置。 這里的目標是從tblResults查詢字段,並將它們連接到具有相同resultid
tblTraceOutput中的最后一行(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
, 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
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的結果
我認為這是你正在尋找的那個。 該查詢使用子查詢分別得到最新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
您可以使用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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.