Mysql 查询以根据所有列值获取不同的值

Mysql 查询以根据所有列值获取不同的值,mysql,Mysql,我有一个带有状态列的表tasks,status的值可以是0、1或2 我需要实现以下逻辑: 如果状态中的任何值为0,则答案为0 如果所有值均为2,则结果为2 否则,结果是一 现在我用3个查询来完成这项工作 a) SELECT status FROM tasks b) SELECT status FROM tasks WHERE status = 2; c) SELECT status FROM tasks WHERE status = 0 因此a)用于获取总行数。然后我将其与b)给出的行数进

我有一个带有状态列的表tasks,status的值可以是0、1或2

我需要实现以下逻辑:

  • 如果状态中的任何值为0,则答案为0
  • 如果所有值均为2,则结果为2
  • 否则,结果是一
现在我用3个查询来完成这项工作

a) SELECT status FROM tasks
b) SELECT status FROM tasks WHERE status = 2;
c) SELECT status FROM tasks WHERE status = 0
因此a)用于获取总行数。然后我将其与b)给出的行数进行比较。如果匹配,那么答案是2。如果他们不这样做,我就查询c)。如果为非空,则答案为0,否则答案为1

有没有办法为此编写一个查询?或者有更好的方法吗?

您可以使用条件聚合:

子查询执行应用业务逻辑所需的所有计数。外部查询仅使用此信息来生成所需的结果

从您的描述中不清楚
案例中的第一个条件是否优先于第二个条件。如果没有,则只需在
s时切换两个
的位置。

使用以下命令

 SELECT (case 
when ((SELECT count(*) FROM tasks WHERE status = 0)>0) then 0 
when ((SELECT count(*) FROM tasks WHERE status = 2)=(SELECT count(*) FROM tasks)) then 2
else 1 end)  AS countOfStatus 
尝试:


-因为当所有状态值为2时,最小值将为2,当任何值为0时,最小值将为0,否则最小值将为1。

请检查答案。从技术上讲,第一个答案是正确的,我选择它作为正确答案,因为这是我的想法。我还得学习coutn和case。然而,你是绝对正确的。这本来是可行的。您好,Giorgos,+1,但您的查询仍然存在问题,您需要将最后第二行修改为->
计数(状态为2时,则为2结束)为s2
@jQuery.PHP.Magento.com
计数(状态为2时,则为**1结束)
的目的是对所有2进行计数。如果我将
1
更改为
2
,则
COUNT
将返回
COUNT*2
,并且
sAll=s2
谓词将在外部查询中失败。@jQuery.PHP.Magento.com条件聚合工作,因为
COUNT
忽略
NULL
s。因此,
COUNT(状态为2时,则为1结束)
精确计算具有
status=2的行数。
 SELECT (case 
when ((SELECT count(*) FROM tasks WHERE status = 0)>0) then 0 
when ((SELECT count(*) FROM tasks WHERE status = 2)=(SELECT count(*) FROM tasks)) then 2
else 1 end)  AS countOfStatus 
SELECT MIN(status) FROM tasks;