たとえば、以下のテーブルで、
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命令ですっきりと処理したいのですが、ご教授のほどよろしくお願いいたします。
select count(*)=count(if(B=1 and C=1,1,null)) from `table` where A = 1;
2番のものと考え方は同じですが、mysql内で比較までやっているので1,0で返ります。
case,sumではなくif,countを使って作ってみました。
ヱヴァンゲリヲン新劇場版:破 EVANGELION:2.22 YOU CAN (NOT) ADVANCE.【初回限定版】[DVD]
イルカ賞って何?
すいません。このようなご回答にはコメントできませんので、あしからずご了承ください。
下記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で汎用的に使えるのでおすすめです。
なるほど、ありがとうございます。
こういう使い方もあるんですね。
参考にさせていただきます。
基本的な方法
SELECT count(*) FROM `table` WHERE A = 1 AND (B <> 1 OR C <> 1);
今回の条件ならば下記のようなものも使えるが速度面では計算不要の上記が早い
こういった方法もあるという程度に覚えておくと将来もしかしたら役に立つかもしれない
SELECT count(*) FROM `table` WHERE A = 1 AND (B * C <> 1);
ありがとうございます。
countで数を同時に数えられるので、参考にさせていただきます。
select count(*)=count(if(B=1 and C=1,1,null)) from `table` where A = 1;
2番のものと考え方は同じですが、mysql内で比較までやっているので1,0で返ります。
case,sumではなくif,countを使って作ってみました。
なるほど、これいいですね。
こういう方法が一番期待していたものです。
ありがとうございました!
なるほど、これいいですね。
こういう方法が一番期待していたものです。
ありがとうございました!