MySQLのSQLの書き方で、複数の項目に一致するか調べる方法で、ORを使った方法よりもすっきりしているか、処理がスマートな方法を教えてください。


例)
a_1,a_2,a_3,a_4のいずれかが、100であるレコードをセレクトする
SELECT
*
FROM
a_table
WHERE
(
a_1 = "100"
OR a_2 = "100"
OR a_3 = "100"
OR a_4 = "100" )

INを使うような気がするのですが、左に値をもってくることもできないでしょうし、ORを使うしかないのでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/01/24 16:29:45
  • 終了:2007/01/25 02:40:23

回答(3件)

id:inokuni No.1

いのくに回答回数1343ベストアンサー獲得回数212007/01/24 18:01:45

ポイント23pt

テーブルの設計が適切でないと考えます。

きちんと正規化されていれば、このような SQL 文にはならないはずです。

http://oku.edu.mie-u.ac.jp/~okumura/php/db.html


もし、テーブルの設計変更ができないのであれば、そのような SQL 文でやるしかないでしょう。

id:dingding

ありがとうございます。

2007/01/25 02:38:45
id:Sampo No.2

Sampo回答回数556ベストアンサー獲得回数1042007/01/24 18:05:40

ポイント30pt

where 100 in ( a_1, a_2, a_3, a_4 )

使えないことなんてありませんよ。

まったく正しいwhere節です。

http://end

id:dingding

できるんですね。

ありがとうございます。

2007/01/25 02:38:58
id:b-wind No.3

b-wind回答回数3344ベストアンサー獲得回数4402007/01/24 18:35:56

ポイント40pt

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.3.1.2 比較演算子

一応 IN 構文も使えるはず。

SELECT * FROM a_table
  WHERE "100" IN ( a_1,a_2,a_3,a_4 );

ただ、どちらにせよこのやりかたでは INDEX がうまく使えず、パフォーマンスが悪い。

MySQL は1度に1つの INDEX しか使えないので4つのクエリに分割して実行し、結果を結合する方が良いように思える。

id:dingding

4つを分割して実行して、結果を結合するなんて考えてもみませんでした。

ありがとうございます。

2007/01/25 02:39:36

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません