0

次のようなクエリを作成しようとしています

if (select count(*) from Users where fkId=5000 and status='r') =
   (select count(*) from Users where fkId=5000) then ..

たった1 つのクエリで。

これが意味することは、fkId=5000 を持つすべての行にstatus=rある場合、何かを行うということです。

の行はいくつでもありfkId=5000、それらの行の任意の部分が 、 、 などを持つ可能性がありますstatus=rstatus=k私は、すべての行が (他のステータスではなく) を持っている場合に興味status=lがありますstatus=afkId=5000 status=r

私が今やっている方法は、

how many rows with id=5000 and status = 'r'?
how many rows with id=5000?
are those numbers equal? then ..

このクエリを 2つで<> ALLはなく 1 つのクエリだけを使用して書き直す方法を見つけようとしていますNOT IN。いくつかの処方を試しましたGROUP BYが、正しい結果が表示されませんでした.

4

5 に答える 5

2

ステータスが「r」に等しくない行を確認することをお勧めします

     SELECT count(*)>0 FROM Users WHERE fkId = 5000 AND status != 'r'
于 2013-06-08T15:59:44.377 に答える
0

簡単!

同じテーブルに再び参加するだけです。テスト用の完全なコードは次のとおりです。

CREATE TABLE Users(id int NOT NULL AUTO_INCREMENT, fkID int NOT NULL,  status char(1), PRIMARY KEY (id));

INSERT Users (fkID, status) VALUES (5000, 'r');
INSERT Users (fkID, status) VALUES (5000, 'r');
INSERT Users (fkID, status) VALUES (5000, 'r');

-- The next query produces "0" to indicate no miss-matches
SELECT COUNT(*) FROM Users u1 LEFT JOIN Users u2 ON u1.id=u2.id AND u2.status='r' WHERE u1.fkID=5000 AND u2.id IS NULL;

-- now change one record to create a miss-match
UPDATE Users SET status='l' WHERE id=3 ;

-- The next query produces "1" to indicate 1 miss-match
SELECT COUNT(*) FROM Users u1 LEFT JOIN Users u2 ON u1.id=u2.id AND u2.status='r' WHERE u1.fkID=5000 AND u2.id IS NULL;

DROP TABLE Users;

したがって、結果でテストする必要があるのは、それが 0 (ゼロ) であることだけです。つまり、すべてが fkID=5000 で、status='r' もあるということです。

テーブルに適切にインデックスを付ければ、同じテーブルに再び結合することは問題ではなく、確かに 2 番目のクエリを実行する必要はありません。

于 2013-06-08T20:24:41.970 に答える