mySQLのSELECT文で質問です。


たとえば、以下のテーブルで、
Aカラムが1である行を対象に、すべての行が(B==1 かつ C==1)であるか、そうでないかを調べたいとします。
数は不要です。
CREATE TABLE table ( A int, B int, C int );

いまのところ、以下のように②と④の値が同じかどうかで判断しています。
①SELECT * FROM table WHERE A=1;
②SELECT FOUND_ROWS();
③SELECT * FROM table WHERE B=1 AND C=1;
④SELECT FOUND_ROWS();

質問は、これをなんとか1命令ですっきりと処理したいのですが、ご教授のほどよろしくお願いいたします。

回答の条件
  • URL必須
  • 1人3回まで
  • 13歳以上
  • 登録:2010/05/25 23:24:34
  • 終了:2010/05/26 21:33:11

ベストアンサー

id:fenstrial No.4

fenstrial回答回数57ベストアンサー獲得回数142010/05/26 17:45:41

ポイント41pt

select count(*)=count(if(B=1 and C=1,1,null)) from `table` where A = 1;

2番のものと考え方は同じですが、mysql内で比較までやっているので1,0で返ります。

case,sumではなくif,countを使って作ってみました。

http://q.hatena.ne.jp/

id:cochoo

なるほど、これいいですね。

こういう方法が一番期待していたものです。

ありがとうございました!

2010/05/26 21:28:49

その他の回答(3件)

id:wwwww1 No.1

wwwww1回答回数63ベストアンサー獲得回数02010/05/25 23:46:59

ヱヴァンゲリヲン新劇場版:破 EVANGELION:2.22 YOU CAN (NOT) ADVANCE.【初回限定版】[DVD]

ヱヴァンゲリヲン新劇場版:破 EVANGELION:2.22 YOU CAN (NOT) ADVANCE.【初回限定版】[DVD]

  • 出版社/メーカー: キングレコード
  • 発売日: 2010-05-26
  • メディア: DVD

イルカ賞って何?

id:cochoo

すいません。このようなご回答にはコメントできませんので、あしからずご了承ください。

2010/05/26 00:22:20
id:p332 No.2

p332回答回数36ベストアンサー獲得回数32010/05/25 23:59:50

ポイント26pt

下記SQLで良いと思います。

caseを使い、任意の条件を満たせば1、満たさなければ0、という式を作ります。

その式の合計(sum)をとれば、その行数がわかりますので、全体の行数と一致するかどうか見れば良いです。

SELECT

count(*)

,sum(case when b=1 and c=1 then 1 else 0 end) cnt2

FROM table

WHERE A=1

caseのほかに、ifなどでもできるかと思いますが、caseは標準SQLで汎用的に使えるのでおすすめです。

http://neoinspire.net/archives/108

id:cochoo

なるほど、ありがとうございます。

こういう使い方もあるんですね。

参考にさせていただきます。

2010/05/26 02:21:39
id:Committeeman No.3

Committeeman回答回数153ベストアンサー獲得回数192010/05/26 00:26:46

ポイント23pt

基本的な方法

SELECT count(*) FROM `table` WHERE A = 1 AND (B <> 1 OR C <> 1);

今回の条件ならば下記のようなものも使えるが速度面では計算不要の上記が早い

こういった方法もあるという程度に覚えておくと将来もしかしたら役に立つかもしれない

SELECT count(*) FROM `table` WHERE A = 1 AND (B * C <> 1);

http://q.hatena.ne.jp/answer

id:cochoo

ありがとうございます。

countで数を同時に数えられるので、参考にさせていただきます。

2010/05/26 02:17:47
id:fenstrial No.4

fenstrial回答回数57ベストアンサー獲得回数142010/05/26 17:45:41ここでベストアンサー

ポイント41pt

select count(*)=count(if(B=1 and C=1,1,null)) from `table` where A = 1;

2番のものと考え方は同じですが、mysql内で比較までやっているので1,0で返ります。

case,sumではなくif,countを使って作ってみました。

http://q.hatena.ne.jp/

id:cochoo

なるほど、これいいですね。

こういう方法が一番期待していたものです。

ありがとうございました!

2010/05/26 21:28:49
  • id:b-wind
    >数は不要です。
    数に意味はなくても count() 関数使うようにした方が良いな。

    適切なインデックスがあればインデックススキャンのみで処理が済むが、
    SELECT * としてしまうと実際には使いもしないデータでも読み込まなきゃならなくなる。
    DBの実装によってはいろいろと条件があるかもしれないけど、殆どの場合でデメリットはないはず。

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

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

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

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