2017-01-17 7 views
0

参加します。すべてを戻す正しい方法は何ですか?また、「応答」表に何もない場合は「null」だけですか?SQLクエリは、私はこのmysqlの文を持って

ありがとうございました

+0

あなたは '左外側join'をしたいように見える - 内部結合よりも少し複雑に、私はオンラインのどこかでそれらについて読むことをお勧めしたいです。 – jackarms

答えて

0

質問にはいくつかの問題があります。まず、callback_holdingテーブルからrefカラムでグループ化していますが、このテーブルだけでなく他のテーブルからも非集約カラムを選択しています。これを回避するには、サブクエリ内のcallback_holdingの最大IDを検索し、それを他のテーブルに結合する集計を行う必要があります。

次に、答えが見つからない場合、レコードは返されないと述べました。これはINNER JOINの性質ですが、に結合を切り替えてLEFT JOINを使用すると、クエリのその時点までのレコードは失われません。回答表のこの列がNULLである場合は、COALESCE(a.submit_dt, 'NA')を使用してNAを表示しました。この列がdatetimeの場合は、適切なデフォルト値を使用する必要があります。 NOW()

SELECT ca.*, 
     v.*, 
     COALESCE(a.submit_dt, 'NA') AS submit_dt, -- display 'NA' if no answer 
     t.max_id 
FROM callback_holding ca 
INNER JOIN 
(
    SELECT ref, MAX(id) AS max_id 
    FROM callback_holding 
    GROUP BY ref 
) t 
    ON t.ref = ca.ref AND 
     t.max_id = ca.id 
INNER JOIN valuations v 
    ON v.Ref = ca.ref 
LEFT JOIN answer a 
    ON a.title = ca.ref 
WHERE v.Consultant = '$user' AND 
     ca.isholding = 2 
ORDER BY ca.reccomendeddate 
+0

こんにちは、ありがとうございました。私はそのクエリを実行しようとし、以下のエラーがあります。 –

+0

分析中に4つのエラーが見つかりました。 エイリアスが見つかりました。 (84番の "t"の近く) 予期しないトークン。 (84番の "t"の近く) 予期しないトークン。 (85桁の "。"の近く) 予期しないトークン。 (位置86の "max_id"の近く) –

+0

@GazSmith申し訳ありませんが、SELECT句にカンマがありませんでした。私の更新された答えを試してください。 –

0

で試してみてください。

SELECT ca.*, MAX(ca.id), v.*,a.submit_dt from callback_holding ca 
INNER join valuations v on v.Ref = ca.ref 
LEFT join answer a on a.title = ca.ref 
WHERE v.Consultant = '$user' and ca.isholding = 2 
GROUP BY ca.ref DESC order by ca.reccomendeddate asc 
関連する問題