我需要多次左外连接和冷敷?

时间:2014-03-23 13:23:20

标签: mysql sql join coldfusion

我每天都会通过电子邮件发送给订阅者,使用coldfusion和mySQl构建。

我目前有2个教会参加试验计划。当参与的教会对每日灵修进行更改时,更改将保存在已编辑的表格中。 当灵修出现在两个教堂时,查询首先搜索已编辑的版本。如果存在,它会发送编辑后的版本。否则,默认的灵修将会传给另一个教会。

我可以使用左外连接来显示已编辑的版本。遗憾的是,编辑后的版本已发送给所有人。

我是否需要使用另一个左外连接或是否有其他方法来解决此问题? 有两个问题:

1。 Getclients

由3个创建布局的表组成,显示公司信息,并提供订阅者信息,所有这些都由contact_id加入。

订阅者表

耗材,电子邮件,名字,时区和contact_id

联系表

提供社交链接,页脚,公司名称,取消订阅信息的信息 contact_id,company,city,state,zip,facebook,twitter,linkedin,youtube,website

布局表

27个字段,提供contact_id加入的响应式电子邮件的页眉,页脚和颜色组合的所有信息

我的第一个获取所有电子邮件信息的查询:

<cfquery name="getClients" datasource="#application.dsn#">
select *
from (subscriber INNER JOIN contacts ON subscriber.contact_id = 
contacts.contact_id)INNER JOIN layout ON contacts.contact_id = layout.contact_id
where subscriber.timezone = '4'
</cfquery>

2。 GetDevotional

由两个供奉灵修的表格组成:

MOBILE TABLE

标题,经文,正文,display_date

这是提供每日奉献的默认表。

编辑表

eTitle,eScripture,ebody,display_date

当信息存在时的可选表替换MOBILE TABLE。否则默认的灵修将会消失。 通过在GETDEVOTIONAL QUERY中使用左外连接,我可以显示已编辑的版本,但它会显示给每个人,而不仅仅是创建编辑版本的教会。

<cfquery name="getDevotional" datasource="#application.dsn#">
SELECT mobile.mob_id AS id, mobile.display_date AS display_date,
mobile.title AS title, mobile.body AS body, mobile.scripture AS
scripture,edited.edit_id AS edit_id,edited.contact_id AS contact_id,edited.etitle AS 
etitle, edited.escripture AS escripture,edited.ebody AS ebody

FROM mobile
left outer join edited ON mobile.mob_id = edited.mob_id
where mobile.display_date = <cfqueryparam value ="#dateformat(now(), "YYYY-MM-DD")#"
cfsqltype="cf_sql_date">
</cfquery>

输出:

<cfif getdevotional.edit_id NEQ "">
<p style="font-family: Arial, Helvetica, sans-serif; 
font-size: 14px;font-weight: bold;color: #h2_color#;margin-top: 12px;
margin-bottom: 4px;padding-bottom: 0px;">#GetDevotional.etitle#<br />
#getDevotional.escripture#</p>

<p style="text-indent:15px;">
#paragraphFormat(GetDevotional.ebody)#
</p>

<cfelse>

<p style="font-family: Arial, Helvetica, sans-serif; font-size: 14px;
font-weight: bold;color: #h2_color#;margin-top: 12px;margin-bottom: 4px;
padding-bottom: 0px;">#GetDevotional.title#<br />
#getDevotional.scripture#</p>

<p style="text-indent:15px;">
#paragraphFormat(GetDevotional.body)#
</p>

这个问题导致整个项目陷入停顿。非常感谢您的建议。

1 个答案:

答案 0 :(得分:1)

你正在尝试一个查询,如果它在那里给我x,否则给我。几乎任何数据库都可以这样做:

select case 
when table3.field1 is not null then table3.field1
else table2.field1
end TheFieldYouWant

from table1 join table2 on something
left join table3 on something

某些数据库具有可以使用的功能,而不是case构造。我可以查找MySQL,但你也可以。

正如我的评论中所提到的,您仍然存在数据库设计问题,因为您没有存储编辑所适用的教堂。一旦你解决了这个问题,你就可以担心编码了。