我有三张桌子 第一个表(日)只保存值,即
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(外部)连接和子查询来做,但到目前为止无济于事(
答案 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.status
或te.satus
中选择第一个非空列。 LEFT JOIN
表示如果相应的表缺少加入status
的记录,则添加的列(例如tech_id
或NULL
)可能为day.uid
。请注意,在任何一种情况下,使用OR
作为tech_id
此时也可能是NULL
。 (上面的查询适用于(day_id,tech_id)
是查找和模板表的候选键的premsie。)