我正在尝试编写像
这样的查询if (select count(*) from Users where fkId=5000 and status='r') =
(select count(*) from Users where fkId=5000) then ..
只是一个查询。
这意味着,如果fkId = 5000 的所有行也还有status=r
,那么就做点什么。
fkId=5000
可以包含任意数量的行,这些行中的任何一行都可以包含status=r
,status=k
,status=l
,status=a
等。我对所有fkId=5000
的行都有status=r
(而不是其他任何状态)的情况感兴趣。
我现在的方式是
how many rows with id=5000 and status = 'r'?
how many rows with id=5000?
are those numbers equal? then ..
我正在尝试弄清楚如何仅使用1个查询而不是2来重写此查询。关键字ALL似乎无法编写此类查询(<> ALL
等效到NOT IN
)。我尝试了几种GROUP BY
配方但无法获得正确的结果。
答案 0 :(得分:3)
最有效的方法是:
if not exists (select 1
from users
where fkid = 5000 and (status <> 'r' or status is null)
)
这将在第一个不匹配的行停止查询。
答案 1 :(得分:2)
我建议您检查状态不等于'r'的任何行
SELECT count(*)>0 FROM Users WHERE fkId = 5000 AND status != 'r'
答案 2 :(得分:0)
在下列情况下,如果数字1
为“true”(它是),那么您将获得Yes
,如果不是,您将获得No
:
SELECT IF(1, 'Yes', 'No') AS yesorno
(来吧 - 试试吧!)
但是,在您的情况下,以下更合适:
SELECT IF (
(SELECT COUNT(*) FROM Users WHERE fkId=5000 AND status IN('r') AND status NOT IN('1', 'a', 'k')) = (SELECT COUNT(*) FROM Users WHERE fkId=5000),
'They are equal.',
'They are not equal.'
)
AS are_they_equal
通过添加AS
,您可以操纵返回给您的“列”的名称。
希望有帮助...另外,如果您想了解更多信息,请参阅this page。
:)
答案 3 :(得分:0)
EASY!
只需加入回到同一张桌子即可。以下是完整的测试代码:
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也有状态='r'
如果你正确索引你的表,那么加入回同一个表不是问题,当然也不得不进行第二次查询。
答案 4 :(得分:0)
除了NOT EXISTS
版本 - 它应该是最有效的,因为它根本不计数并且一旦找到与条件不匹配的值就退出,还有一种方法,那将是如果status
不可为空,则工作,如果(fkId, status)
上有索引则效率很高:
IF EXISTS
( SELECT 1
FROM Users
WHERE fkId = 5000
HAVING MIN(status) = 'r'
AND MAX(status) = 'r'
)
但有一点不同。如果fkId=5000
没有行,则上面显示为false,而NOT EXISTS
版本显示为true - 这可能是您想要的。