Mysql 对案件提出条件。。WHEN vs WHERE子句?

Mysql 对案件提出条件。。WHEN vs WHERE子句?,mysql,Mysql,我想知道,写p.amount是空的atcase。。什么时候函数更好,或者在WHERE子句中写入它 ONE: select *, case when p.amount is null then '1' else (select count(1) from Money_paid mp where mp.post_id = p.id and mp.user_id = :user_id limit 1

我想知道,写
p.amount是空的
at
case。。什么时候
函数更好,或者在
WHERE
子句中写入它

ONE:

select *, 
     case when p.amount is null then '1'
          else (select count(1) 
                  from Money_paid mp 
                where mp.post_id = p.id and mp.user_id = :user_id limit 1)
     end paid
from Posts p 
where p.id = :post_id
select *, 
      (select count(1) 
         from Money_paid mp 
           where mp.post_id = p.id and 
                 mp.user_id = :user_id and
                 p.amount is not null
        limit 1) paid
from Posts p 
where p.id = :post_id
两个:

select *, 
     case when p.amount is null then '1'
          else (select count(1) 
                  from Money_paid mp 
                where mp.post_id = p.id and mp.user_id = :user_id limit 1)
     end paid
from Posts p 
where p.id = :post_id
select *, 
      (select count(1) 
         from Money_paid mp 
           where mp.post_id = p.id and 
                 mp.user_id = :user_id and
                 p.amount is not null
        limit 1) paid
from Posts p 
where p.id = :post_id

那是哪一个呢?

都不是。编写此文件的更好方法是使用
现有的

select p.*,
       (case when p.amount is null then 0  -- 0 seems more reasonable than 1
             when exists (select 1
                          from Money_paid mp
                          where mp.post_id = p.id and mp.user_id = :user_id
                         )
             then 1 else 0
        end) as IsPaidFlag
from Posts p 
where p.id = :post_id;

我倾向于使用单独的
案例
条件。这两个版本的优化结果可能相同。但是,具有外部相关性也可能会混淆优化器。

两者都不一样。编写此文件的更好方法是使用
现有的

select p.*,
       (case when p.amount is null then 0  -- 0 seems more reasonable than 1
             when exists (select 1
                          from Money_paid mp
                          where mp.post_id = p.id and mp.user_id = :user_id
                         )
             then 1 else 0
        end) as IsPaidFlag
from Posts p 
where p.id = :post_id;

我倾向于使用单独的
案例
条件。这两个版本的优化结果可能相同。但是,具有外部相关性也可能会混淆优化器。

是否使用
为空
签入
COALESCE
中的WHERE
子句没有实际区别,但是,如果只需要检查一条记录,则应将
COUNT
替换为
EXISTS

SELECT  *,
        CASE WHEN p.amount IS NULL THEN 1
        ELSE
        EXISTS
        (
        SELECT  NULL
        FROM    money_paid
        WHERE   post_id = p.id
                AND user_id = :user_id
        )
        END
FROM    posts p
WHERE   p.id = :post_id

无论是使用
IS NULL
签入
合并
还是在
WHERE
子句中使用
都没有实际区别,但是,如果只需要检查一条记录,则应将
计数
替换为
存在

SELECT  *,
        CASE WHEN p.amount IS NULL THEN 1
        ELSE
        EXISTS
        (
        SELECT  NULL
        FROM    money_paid
        WHERE   post_id = p.id
                AND user_id = :user_id
        )
        END
FROM    posts p
WHERE   p.id = :post_id


为什么要使用限制1?你想返回什么?付了钱的号码还是国旗?另外,
p.amount为null时返回值不相同(第一个返回1,第二个返回0)。@GordonLinoff否我不想要已付款的数字,我只想检查是否有行?(刚刚存在)@Quassnoi我使用了
LIMIT 1
,因为我只想检查是否只存在一行,我不想计算任何东西。@stack:那些满足
WHERE
条件的,当然了为什么要使用LIMIT 1?你想返回什么?付了钱的号码还是国旗?另外,
p.amount为null时返回值不相同(第一个返回1,第二个返回0)。@GordonLinoff否我不想要已付款的数字,我只想检查是否有行?(仅存在)@Quassnoi我使用了
限制1
,因为我只想检查是否只存在1行,我不想计算任何东西。@堆栈:那些满足
WHERE
条件的,当然为什么
选择NULL..
?我想要这些输出:
1
如果用户付费或者帖子是免费的,或者
0
如果不是免费的,用户没有付费。@stack:这就是
存在的问题
处理的问题。无论
中存在什么
,您都可以使用
选择*
选择1
或几乎任何您想要的东西。我使用
SELECT NULL
是因为我已经习惯了。仅供参考,您可以告诉我是否可以通过
join
而不是子查询来实现此功能?@stack:是的,但是如果
SELECT NULL..
,效率会更低?我想要这些输出:
1
如果用户付费或者帖子是免费的,或者
0
如果不是免费的,用户没有付费。@stack:这就是
存在的问题
处理的问题。无论
中存在什么
,您都可以使用
选择*
选择1
或几乎任何您想要的东西。我使用
SELECT NULL
,因为我已经习惯了。仅供参考,请告诉我是否可以通过
join
而不是子查询来实现此功能?@stack:是的,但在您的查询中效率会较低,如果post是免费的,那么输出是
0
,如果帖子不是免费的,用户没有付费,则输出为
0
,如果帖子不是免费的,用户付费,则输出为
1
。。。!这种结构很难处理。我想要这个
1,0,1
(你的是
0,0,1
)。所以我可以这样简单地处理:
如果($result['paid']==1){show it}否则{dont show it}
@stack。正如答案中所说,您可以将
1
作为第一个条件。我只是觉得很尴尬。在你的查询中,如果帖子是免费的,那么输出是
0
,如果帖子不是免费的,用户没有付费,那么输出是
0
,如果帖子不是免费的,用户付费,那么
1
。。。!这种结构很难处理。我想要这个
1,0,1
(你的是
0,0,1
)。所以我可以这样简单地处理:
如果($result['paid']==1){show it}否则{dont show it}
@stack。正如答案中所说,您可以将
1
作为第一个条件。我只是觉得很尴尬。而且,在这种情况下,问题本身对于值是不明确的。