MySQL - 告诉列_all_是否具有相同的值

时间:2013-06-08 15:53:55

标签: mysql sql

我正在尝试编写像

这样的查询
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=rstatus=kstatus=lstatus=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配方但无法获得正确的结果。

5 个答案:

答案 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 - 这可能是您想要的。