
複数のテーブルをleft joinで繋いで、カラムをエクセルのようなシートとしてWebで表示しています。
各カラムは、VERCHAR、DECIMAL、INT(SMALLINT~MIDIUMINT)の型を持っています。
エクセルのシートのような感じなので、エクセルのオートフィルタのような機能を付けたいと考えています。
各カラムをAND条件で指定できるやつです。
ですが、そもそもカラムの数が30ほどあります。
このような場合でもANDやBETWEENを使ってひたすらWHERE条件やCASEなどで抽出するようにするのでしょうか?
DECIMALやINTの場合は条件を○○(最低値)~○○(最高値)のようにします。
VARCHARの場合は、選べる文字列が複数(数十程度)あり、そこから選べるようにします。
例えば、東京駅。渋谷駅、新宿駅、品川駅、横浜駅・・・などがあって、フィルターしたい文字列だけ選びます。
たぶんINを使った感じになります。
聞きたいのは、WHERE ○○ AND ○○ AND ○○ AND ・・・のようにひたすら条件を作っていくしかないのでしょうか?
どうぞよろしくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
書式としては
col1 = 'A' AND col2 = 'B' AND col3 = 'C'
なら
WHERE (col1,col2,col3) IN (('A','B','C'))
ORならセットで複数指定して
WHERE
(col1,col2,col3)
IN (
('A','A','A'),
('B','B','B'),
('A','B','C')
)
という書き方もあるにはあります。パフォーマンスはEXPLAINしてみて。
ご参考まで
No.2
- 回答日時:
>ひたすらWHERE条件や~
そうすべきです。
WHERE句が最も速く抽出条件を絞ります。
HAVINGやJOINでも絞れますが、処理した結果に
ついて条件をかけるので、遅くなります。
それと、30くらいの条件などは通常業務ではよく
出てくる範囲です。尚、サブクエリが使えるDBなら、
サブクエリを入れ子にすると、ANDで条件を結合
するより効率があがります。
(1)SELECT * FROM XX WHERE a=1 AND b=2
(2)SELECT * FROM (SELECT * FROM XX WHERE a=1)
WHERE b=2
後者の方が効率が良いということです。特に内側のクエリが
インデックスによる条件抽出なら、外側のクエリが対象とする
レコード群はかなり数が絞り込まれている状態からスタート
できる訳です。
尚、抽出したレコードを更新する場合、JOINしているクエリが
対象だと制約があります。1:1になるか、1:NのN側が保証され
ないと更新できません。保証できない時は対象テーブルと同じ
レイアウトの一時テーブルに抽出レコードを記録し、これと
主キーを使ってINNER JOINします。同じキー構成なので必ず
1:1になります。一時テーブルはセッション単位に独立している
ため、他のスレッドと干渉しません。また、セッションが切れる
時に自動的に解放されるます。従って、トランザクション管理が
ないので高速ですし、後始末も不要です。
ありがとうございます!
>そうすべきです。
>WHERE句が最も速く抽出条件を絞ります。
>HAVINGやJOINでも絞れますが、処理した結果に
>ついて条件をかけるので、遅くなります。
そうなのですね・・・!ひたすらWHEREって効率が悪いのかと勘違いしていました。
>尚、サブクエリが使えるDBなら、
>サブクエリを入れ子にすると、ANDで条件を結合
>するより効率があがります。
これは知りませんでした。
>尚、抽出したレコードを更新する場合、JOINしているクエリが
対象だと制約があります。・・・
ありがとうございます。ここはどうやるのか不明だったのでたいへん参考になりました。
No.1
- 回答日時:
質問の意図がよくわからないのですが・・・
where 条件1 and 条件2 and 条件3
という場合、条件1、2、3のそれぞれに相関関係がないなら
並行して条件を設定して絞り込むしかありません
条件同士なんらかの関係がある場合は、場合によっては
効率的なSQL文がかけるかもしれません
また正規化などきちんとされていれば
joinする際にinner joinで絞り込みができる場合もあります
いま与えられている命題ではその程度しか回答しようがありません
アドバイス頂きましてありがとうございます。
すみません、質問の意図は「30ものカラムの条件をANDで並列に書くことが効率的な方法なのでしょうか?」というものです。
あと質問に書き忘れましたが、このような検索(フィルタリング)をする場合、全てのカラムにインデックスを張る必要がありますか?
このフィルタリングをして抽出したレコードを更新する必要があります。
もしWHEREなどで条件に設定するカラムにインデックスがないと、UPDATE時にテーブル・ロックがかかるのですよね?
一度に数十万行を更新するのでできれば行ロックでUPDATEを済ませたいと思っています。
ちなみにInnoDBです。
>また正規化などきちんとされていれば
>joinする際にinner joinで絞り込みができる場合もあります
ありがとうございます。少し見直す必要もありますが、だいたい正規化できています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Excel(エクセル) Excel2007での条件付き書式について 6 2023/05/02 10:56
- Oracle SQL update方法 2 2022/06/22 14:07
- Oracle sqlのwhere句で下記の条件にしたい場合どうなるでしょうか。 システム日付が開始日以上、終了日以 2 2022/03/25 21:22
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
- その他(Microsoft Office) エクセル 条件付き書式 日をまたぐ塗りつぶし 1 2023/01/13 18:00
- Excel(エクセル) エクセル:シフト表条件付き書式色付けのカウント方法 3 2022/10/11 21:59
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- その他(パソコン・スマホ・電化製品) エクセル初心者です。 仕事でエクセルを使っていて、普段は素人でもできる簡単な関数を使ったことがある程 1 2022/05/25 11:17
- 電車・路線・地下鉄 武蔵小杉<->神田エリアの通勤経路について 3 2022/04/11 20:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブルの列数を調べたい
-
[MySQL]LOAD DATA INFILE一部レ...
-
group byで最後のレコードを抽...
-
WHEREなどの条件が多い場合、ど...
-
時間範囲が重複したレコードを...
-
MySQL 改行コードを含む文字列...
-
MYSQLで小数点を表示する場合と...
-
SELECT文で、指定カラム以外の...
-
ホームページを作ろうと思いま...
-
スペースによる絞り込み検索をS...
-
AUTO_INCREMENTに0はダメ?
-
DBの定義のサイズを大きくし過...
-
一部のカラムでdistinctし全て...
-
MYSQLで全てのカラムから検索す...
-
BULK INSERT時のNull許容について
-
INDIRECT関数の代替方法は?
-
【SQL】select に ワイルドカー...
-
UNIONする際、片方テーブルしか...
-
type date にnullをinsert
-
【Transact-sql】 where条件、i...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブルの列数を調べたい
-
同一日に複数レコードがある場...
-
group byで最後のレコードを抽...
-
[MySQL]LOAD DATA INFILE一部レ...
-
MySQL 改行コードを含む文字列...
-
MYSQLで小数点を表示する場合と...
-
select * での表示が崩れる?
-
MySQL AUTO_INCREMENTが最大に...
-
WHEREなどの条件が多い場合、ど...
-
フレンドリストのようなものを...
-
betweenを使うyyyy/mm/ddでの範...
-
[MYSQL]日付のカラムにデーター...
-
時間範囲が重複したレコードを...
-
VB.NETでSQL-SERVERにクエリを...
-
MySQLについて
-
MySQLでカラム内の値の先頭の数...
-
mysqlで年と月を別々のカラムに...
-
whereの使い方が分からないので...
-
データベースについて
-
MySQL テーブルの一部のカラム...
おすすめ情報