关于mysql case when 的难题

[复制链接]
查看11 | 回复2 | 2008-8-9 23:33:53 | 显示全部楼层 |阅读模式
一个php程序,链接mysql;
数据库有两个表,各有adid和link字段,主表有enabled字段。
ad_pre表,预备表,主表
ad表,正式表
需求是想知道预备表中的数据在正式表中的状态
现在使用的方法是取出后用php判断状态。
select

pre.enabled,pre.link,ad.link as adlink
from

_ad_pre as pre

left join

_ad as ad

on ad.adid=pre.adid
取出记录集以后迭代记录集是利用如下代码输出状态。
if($row['adlink']=='')

$outer.= '[td]0[/td]';
else if($row['adlink']!=$row['link'])

$outer.= '[td]1[/td]';

else if($row['enabled']==0)

$outer.= '[td]2[/td]';

else

$outer.= '[td]3[/td]';
但是这样有局限性,就是不能根据此条件进行结果集排序。
知道mysql有case when,想通过case when实现php中那个if then的逻辑,但实验了好久,不知道应该怎么写,请各位大侠教教我。
我的SQL语句是:
select

pre.enabled,pre.link,ad.link as adlink,

CASE

WHENpre.link=='' THEN 0

ELSE WHENpre.link!=ad.link THEN 1

ELSE WHENpre.enabled==0 THEN 2

ELSE 3

END CASE
from

_ad_pre as pre

left join

_ad as ad

on ad.adid=pre.adid
但在第一case的时候就提示错误。终不得解。
经过询问高人得知,Case When不能实现,以为逻辑中有先判断不等,然后再判断等的逻辑。
最后用mysql的if操作符解决。
代码如下:
select

pre.adid,pre.enabled,pre.link as prelink,ad.link as adlink,

if(ad.link is null,0,

if(ad.link!=pre.link,1,

if(pre.enabled=0,2,3)

)

)
from

_ad_pre as pre

left join

_ad as ad

on ad.adid=pre.adid

回复

使用道具 举报

千问 | 2008-8-9 23:33:53 | 显示全部楼层
else不能直接级联,只能级联case,应该这么写1。如果各个when条件互斥的话select
pre.enabled,pre.link,ad.link as adlink,
CASE
WHEN pre.link=='' THEN 0
WHEN pre.link!=ad.link THEN 1
WHEN pre.enabled==0 THEN 2
ELSE 3
END CASE from
_ad_pre as pre
left join
_ad as ad
on ad.a
回复

使用道具 举报

千问 | 2008-8-9 23:33:53 | 显示全部楼层
年代,曾经有过一个神话,那就是吉卜力首部剧场动画《风之谷》中一个叫娜乌西卡的女孩,作为那部里程碑式作品的女主角,娜乌西卡集坚强,高尚,美丽,纯真于一身,有人甚至怀疑她在动画史上的地位永远不会被动摇,直到10年之后一部名叫《新世纪福音战士》的动画出现,把另外一位女孩领进了人们的视野--她就是凌波丽. 这个有着蓝色
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行