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是空的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)
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
作为第一个条件。我只是觉得很尴尬。而且,在这种情况下,问题本身对于值是不明确的。