2016-10-20 9 views
0

以下のクエリは、私が探している3つの回答のうち2つを示しています。サブクエリに私が代わりにノーmysqlでサブクエリを使用する

の列名isCylのための3つの可能な値を空白にすることができ、はい、いいえ

私は、サブクエリがするための最良の方法であるのかはわからないんnullを取得選択それについては、私はどのように他の状態を照会するか分からない。

スケジュール表には、割り当て時にどのタスクを完了する必要があるかを示す一連の列があります。関連テーブルには、タスクが完了するように割り当てられている場合にタスクの結果が格納されます。だから、特定のタスクがスケジュールされているかどうかをテストする必要があります。もしそうなら、私はタスクの結果が関連テーブルに記録されているかどうかを確認する必要があります。簡潔にするために、私はここに列の1つだけを示しています。

SELECT s.`reckey`, 
if(s.cylinders="T", 
     (select 
      if(c.areckey is not null, 
        "yes", 
        "no" 
      ) 
      from cylinders c where c.areckey = s.reckey limit 1 
     ) 
     ,"" 
) as isCyl 
from schedule s 
where s.assignmentDate between 20161015 and 20161016 
order by s.reckey 
+1

サブクエリは一致するものが見つからない場合、結果(null)を返さない可能性があります。 – Uueerdo

+0

Plsは、いくつかのサンプルデータ、サンプルデータに基づく予想結果、およびサンプルデータに基づくクエリによって提供される出力を提供します。サブクエリではなく、左結合が必要なことがあります。 – Shadow

+0

私はLEFT JOINも好んでいますが、列名の周りではなくサブクエリの周りにIF()を置くことができます。 – Barmar

答えて

1

一致するものがないとき、子テーブル内の列のためのNULLを返す、LEFT JOINを使用してください。

SELECT s.reckey, IF(s.cylinders = "T", 
        IF(c.areckey IS NOT NULL, 'yes', 'no'), 
        "") AS isCyl 
FROM schedule AS s 
LEFT JOIN cylinders AS c ON c.areckey = s.reckey 
WHERE s.assignmentDate between 20161015 and 20161016 
ORDER BY s.reckey 

に変更し、同じareckeycylindersに複数の行が存在することができた場合:

LEFT JOIN (select distinct areckey FROM cylinders) AS c on c.areckey = s.reckey 

またはメインクエリでSELECT DISTINCTを使用しています。

+0

明快で簡潔な例をありがとう。この小さなケースでは、私の結果セットは27行にする必要があります。あなたの提案を追加せずに私の結果セット67行だったので、余分なことを学びました。 – Claus

関連する問題