MySQLで、あるテーブル[login]のusernameに載っているか否かをcountで数えるのですが、あるテーブル[nocheck]のusernameに載っている人はカウントしないsql文を作りたいです。

つまりnocheckのテーブルに載っているユーザは特別ユーザで、ここに載っている場合はcountが0を返して欲しいというものです。
元となるsqlは、
select count(*) from login where username='ユーザ名';
となっていますが、これを例えば
select count(*) from login,nocheck where login.username='ユーザ名' and nocheck.username<>'ユーザ名';
だと、nocheckの'ユーザ名'以外の人たちがカウントされてしまいうまくいきません。
こういうときはどう書くものなんでしょうか。

回答の条件
  • 1人2回まで
  • 登録:2006/05/08 21:09:36
  • 終了:2006/05/08 21:46:08

ベストアンサー

id:dungeon-master No.1

dungeon-master回答回数571ベストアンサー獲得回数402006/05/08 21:18:07

ポイント60pt

not Exists を使います。

http://dev.mysql.com/doc/refman/4.1/ja/exists-and-not-exists-sub...

select count(*) from login where login.username='ユーザ名' and not exists ( select * from nocheck.username='ユーザ名' );

か、

select count(*) from login where login.username='ユーザ名' and not exists ( select * from nocheck.username=login.username );

といったところでしょうか。

id:stealthinu

テストしてみました。これで希望通りの動きになります。素早い回答、ありがとうございます。

ただ、このままではちょっとtypoあり動かないので、後から見られた人のために少し訂正しておきますね。

select count(*) from login where login.username='ユーザ名' and not exists ( select * from nocheck where nocheck.username=login.username );

2006/05/08 21:37:16

その他の回答(1件)

id:dungeon-master No.1

dungeon-master回答回数571ベストアンサー獲得回数402006/05/08 21:18:07ここでベストアンサー

ポイント60pt

not Exists を使います。

http://dev.mysql.com/doc/refman/4.1/ja/exists-and-not-exists-sub...

select count(*) from login where login.username='ユーザ名' and not exists ( select * from nocheck.username='ユーザ名' );

か、

select count(*) from login where login.username='ユーザ名' and not exists ( select * from nocheck.username=login.username );

といったところでしょうか。

id:stealthinu

テストしてみました。これで希望通りの動きになります。素早い回答、ありがとうございます。

ただ、このままではちょっとtypoあり動かないので、後から見られた人のために少し訂正しておきますね。

select count(*) from login where login.username='ユーザ名' and not exists ( select * from nocheck where nocheck.username=login.username );

2006/05/08 21:37:16
id:llusall No.2

llusall回答回数505ベストアンサー獲得回数612006/05/08 21:36:16

ポイント10pt

このようなSQLで如何でしょうか?

select count(*)

from login t1

where

t1.username = 'ユーザ名'

not exists (

    select t2.username

    from nocheck t2

    where t2.username = t1.username

   )

  • id:stealthinu
    llusallさんも同じ答えですね。ありがとうございます。
    先にdungeon-masterを評価して締め切ったつもりでいたので、ポイントを分配できませんでした。すみません。
  • id:llusall
    いえ、よくよく見たら「and」が抜けておりました。
    すみませんです。汗

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

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

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

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