运行查询,根据第一个表中的数据从一个表和两个可能的其他表中选择一个

时间:2014-10-04 17:16:35

标签: mysql sql coldfusion railo

我现在正在更新网站,这可能会产生大量的查询!

以简单的形式,有3个表格;

更新 UpdateID Files_FileID Pages_PageID UpdateDate

信息页 PAGEID 的PageTitle

文件 写到FileID FileTitle

Updates表中的Files_FileID链接到Files表中的FileID Updates表中的Pages_PageID链接到Pages表中的PageID

目前,代码在Updates表上执行select查询,然后在Pages_PageID具有值的情况下循环遍历在Pages表上为每个结果运行另一个查询的结果,或者如果Files_FileID具有值,则在Files表上循环。现在,当网站最初在大约15年前完成时,这可能是好的(如果做得不好),但我正准备添加近2000个将在更新表中列出的新文件!

我想更改它(如果可能)以运行一个查询。可以这样做吗?

我可以看到我可以将它分成两个查询,一个用于Pages,一个用于文件,但是后来我有两个基于UpdateDate的结果,我无法在正确的订单。

1 个答案:

答案 0 :(得分:6)

据推测,您希望获得正在更新的内容的类型和标题。

你的问题的答案是适当的加入应该是一个很大的好处。在这种情况下,以下可能会做你想要的:

select u.updateid, updatedate,
       (case when f.fileid is not null then 'File' else 'Page' end) as which,
       coalesce(FileTitle, PageTitle) as title
from updates u left join
     files f
     on u.files_fileid = f.fileid left join
     pages p
     on u.pages_pageid = p.pageid;

这假定每条记录仅引用一个页面或一个文件,但不是两个。此外,为了提高性能,您需要在每个表中的主键上建立索引(如果它们被定义为主键,则会有索引)。