• ベストアンサー

IF文

いつもお世話になっています。 tableA -------------------- ID | NAME 001 | aaaa 002 | bbb 003 | ccc 004 | ddd tableB -------------------- ID | DATE 001 | 2006-11-20 003 | 2006-11-20 というテーブルがあります。 データとして取得したいのは、tableA の4件ですが もし「tableA.ID=tableB.ID」だった場合  MatchID=1 そうでなければ  MatchID=9 にしたいと思っております。 (CASE DATE<=NOW() WHEN tableA.ID=tableB.ID THEN 1 ELSE 9 END) as MatchID とやってみたのですが、ID「001」にしか MatchID=1 になりません。 どのようにしたらよろしいでしょうか? ご教授お願いいたします。 <環境> PHP:4.3.2 Apache:2.0.40 (Red Hat Linux) MySQL:3.23.56

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

論理演算子(ANDなど)は、mysqlのマニュアルに載っています。 http://dev.mysql.com/doc/refman/4.1/ja/logical-operators.html o.sid is NULL、o.sdate<=NOW()、o.edate>=NOW()、を&&でつないでIF文の中に書いてみてください。 ただし、そのSQLを実行して得られる最終的な結果が、wonder_dctさんが求めているものかどうかは、wonder_dctさん以外には判らないです。group byとかしているので、おかしな結果が出ても不思議ではありません。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.4

どれが質問のtableBなのかが分からないので具体例は出せませんが、 まだJoinしてなければJoinして、if文を追加すればいいだけのような気がします。 >o.sid is NULL >o.sdate<=NOW() >o.edate>=NOW() >if の条件は上記のようにしたいのですが、その場合どのようにしたらよろしいでしょうか。(すべて and でつなげたいです) 最初の質問の条件はなしですか? IF(o.sid is NULL and o.sdate<=NOW() and o.edate>=NOW(),ture,false) とすればいい気がします。(チェックしてないので想定通りに動かないかもしれません) #3 さんもおっしゃっていますが、group by をしているので、想定通りの結果が出ない場合があります。 基本的にTABLEをつなげすぎな感があるので、TABLEの構成を見直したほうがいい気がします。

すると、全ての回答が全文表示されます。
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

>全部で5つのテーブルからデータの取得をしているので そのSQL文を全文開示してください。 どんな条件があるのかが分からないので答えを提示できません。

wonder_dct
質問者

お礼

補足です。 表示されなかった理由がわかりました。 where o.sdate<=NOW() and o.edate>=NOW() をしていたからでした。 o.sid is NULL o.sdate<=NOW() o.edate>=NOW() if の条件は上記のようにしたいのですが、その場合どのようにしたらよろしいでしょうか。(すべて and でつなげたいです) よろしくお願いいたいます。

wonder_dct
質問者

補足

moon_night さんありがとうございます。 全部で4つのテーブルでした。 select s.*, d.*, min(d.date) Min, max(d.date) Max, p.pid, if(o.sid is NULL, 9, 1) as MatchID from tableSe s left join tableDate d on (s.sid=d.sid) left join tablePa p on (s.pid=p.pid) left outer join tableOdr o on (s.sid=o.sid) where s.sdate<=NOW() and s.edate>=NOW() and o.sdate<=NOW() and o.edate>=NOW() group by s.sid order by MatchID ASC, s.sdateDESC 基本のSQL文は上記のようになっております。 最初に質問させていただいたときのテーブルは tableA=tableSe, tableB=tableOdr となっています。 よろしくお願いいたします。

すると、全ての回答が全文表示されます。
回答No.1

IFを使った方が簡単だと思います。 SELECT tableA.ID, tableA.NAME, IF(tableB.ID IS NULL, 9, 1) AS MatchID FROM tableA LEFT OUTER JOIN ON tableA.ID = tableB.ID; でどうでしょうか。

wonder_dct
質問者

お礼

すみませんが、補足です。 やってみたのですが、where 以降に「tableA.ID = tableB.ID」を含めるとデータの取得ができません。 全部で5つのテーブルからデータの取得をしているので 「left join」を使っていません。 勉強不足ですみませんが、「left join」を使わない方法等ありましたら 教えていただけませんか。 よろしくお願いいたします。

wonder_dct
質問者

補足

fdsjaklfjas さんご回答ありがとうございます。 もし「DATE<=NOW()」も条件に含める場合どのようにしたらよろしいでしょうか。

すると、全ての回答が全文表示されます。

関連するQ&A