如何在MySQL中的if(like)条件上使用不同的表

时间:2012-03-18 02:48:14

标签: php mysql

我有三张桌子 第一个表(日)只保存值,即

uid,title
1, Mon
2, Tue
3, Wed
etc,etc

第二个表(查找)使用第一个表

uid,day_id,date,status,tech_id
1, 1,2012-01-01, 1,700
2, 2, 2012-01-02, 0,700
etc,etc

第三个表(模板)使用第一个表

uid,day_id,status,tech_id
1, 1, 1,700
2, 2, 0,700
3, 3, 0,700

实际上,每张桌子都会显示更多信息,但现在这些数据无关紧要。

我试图做的是在单个SQL函数中执行所有步骤而不是依赖于代码。我试图使SQL函数使用模板表而不是查找表,如果当天没有条目

在psudocode中:

column 1 = * from days
column 2 = status from(if (template != null, use template)elseif(lookup != null, use lookup)else(null))
where tech_id=700

这在MySQL中是否可行?如果是这样,怎么样?我一直试图用INNER / LEFT(外部)连接和子查询来做,但到目前为止无济于事(

3 个答案:

答案 0 :(得分:1)

我想你想使用COALESCE功能:

SELECT d.*, COALESCE(SELECT status FROM lookup WHERE day_id = d.id, SELECT status FROM template WHERE day_id = d.id) as status
FROM day AS d
WHERE etc, etc

答案 1 :(得分:0)

在玩了一下之后我确实搞清楚了,它有点不善言辞,但它确实有效。

由于这是由PHP执行的,因此可以有变量,将$ tech_id替换为700

SELECT da.*,
        (SELECT status FROM lookup AS lo WHERE tech_id=$tech_id  AND da.uid = lo.day_id) as lookup,
        (SELECT status FROM template AS te WHERE tech_id=$tech_id AND da.uid = te.day_id) as template
        FROM day AS da

它在两个单独的列中完成,但现在已经足够了.....

答案 2 :(得分:0)

我相信这会奏效。它使用COALESCE函数。

SELECT day.uid, day.title, COALESCE(lo.status, te.status) AS status
FROM day
LEFT JOIN lookup lo ON lo.day_id = day.uid
LEFT JOIN template te ON te.day_id = day.uid
WHERE lo.tech_id = $tech_id
   OR te.tech_id = $tech_id

基本上,这会构建一个大的平面集,然后为每条记录从lo.statuste.satus中选择第一个非空列。 LEFT JOIN表示如果相应的表缺少加入status的记录,则添加的列(例如tech_idNULL)可能为day.uid。请注意,在任何一种情况下,使用OR作为tech_id此时也可能是NULL。 (上面的查询适用于(day_id,tech_id)是查找和模板表的候选键的premsie。)