1

必要な結果が得られないのに、サブクエリで結合しようとしています。誰かが実行するためのより良いクエリを提案することができますか、またはおそらく私はサブクエリを使用するべきではありません(私は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

これをAに変更するJOINLEFT JOIN、クエリからより多くの結果が返されますが、最初のを除くすべての行の、、t.delay1およびt.delay2t.delay33つの列に「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
4

3 に答える 3

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からの結果のみを返します

于 2013-03-12T17:23:03.787 に答える
1

これがあなたが探しているものだと思います。クエリはサブクエリを使用して、テーブルoutputidごとresultidに最新のものを個別に取得します。サブクエリの結果は、サブクエリのすべての列で一致する場合、テーブル(それ自体)と結合されます。一致する可能性のあるレコードは最新のものです。resultidtblTraceOutputtblTraceOutput

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
于 2013-03-12T17:21:59.283 に答える
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;
于 2013-03-12T17:24:13.630 に答える