从一个表中选择,并根据该表中的值从一个或两个其他表中选择

时间:2015-03-01 14:23:35

标签: mysql coldfusion

我正在旧网站上做一些工作,它会带回项目列表。

目前,它执行查询从一个表中选择列表项,然后遍历该查询 - 并根据第一个表中的值 - 对第二个表执行查询,或对第三个和第四个表执行查询表。因此,包含100个项目的列表可能会导致运行101个查询!

这是基本的表格布局;

**tblLists** ListID, ListType, ListTitle, tblPages_PageID, tblFiles_FileID, LinkAddress, Description

**tblPages** PageID, PageTitle, PagePath

**tblFiles** FileID, FileName, tblFileTypes_FileTypesID

**tblFileTypes** FileTypeID, FileTypeDescription, FileTypeIcon

tblLists.ListType可以是4种类型之一。它可以是;

1)'Page'在这种情况下,tblLists.tblPages_PageID与tblPages表中的PageID相关。如果它的'Page'它在循环中运行一个查询,它从tblPages中选择PageTitle,PagePath,其中tblPages.PageID = #tblPages_PageID#

2)'文件',在这种情况下,tblLists.tblFiles_FileID与tblFiles表中的FileID相关。如果它的'File'它在循环中运行一个查询,它选择tblFiles.FileName,tblFileTypes.FileTypeDescription,tblFileType.tblFileTypeIcon FROM tblFiles,tblFileTypes WHERE tblFiles.FileID =#tblFiles_FileID#和tblFiles.tblFileTypes_FileTypesID = tblFileTypes.FileTypeID

3)'链接',在这种情况下'LinkAddress'将有一个值。无需进一步查询。

4)'文字',在这种情况下'描述'将有一个值。无需进一步查询。

如果可能,我希望能够将主查询和所有后续查询合并到一个查询中。

所以类似(对于if语句,sql显然不正确 - 但这就是我想要实现的目标!),

select tblLists.ListType , tblLists.ListTitle , tblPages.PageTitle 
, tblPages.PagePath , tblFiles.FileName,tblFileTypes.FileTypeDescription 
, tblFileTypes.FileTypeIcon 

FROM tblLists , tblPages , tblFiles , tblFileTypes
WHERE ...

if type = 'page' 
select PageTitle, PagePath 
from tblPages 
where tblPages.PageID = tblLists.tblPages_PageID

or if type = 'file' 
select tblFiles.FileName, tblFileTypes.FileTypeDescription
, tblFileType.tblFileTypeIcon 
FROM tblFiles 
, tblFileTypes 
WHERE tblFiles.FileID = tblLists.tblFiles_FileID 
and tblFiles.tblFileTypes_FileTypesID = tblFileTypes.FileTypeID

or if type = 'link' no other work needed

or if type = 'text' no other work needed

这可能吗?!

然后我可以运行并输出一个查询,如果类型是'文件'我会从tblFiles和tblFileTypes表中获取所需的信息,如果类型是'Page'我将拥有我需要的东西来自tblPages表,如果它的'Link'或'Text'我也有这两个。

感谢您的帮助:)

更新

感谢Dan推动我的大脑,我已经走到了这一步;

SELECT tblLists.ListType , tblLists.ListTitle , tblLists.LinkAddress , tblLists.Description , tblFiles.FileName , tblPages.PageTitle , tblPages.PagePath

FROM tblLists

LEFT JOIN tblFiles ON tblLists.tblFiles_FileID = tblFiles.FileID
LEFT JOIN tblPages ON tblLists.tblPages_PageID = tblPages.PageID

WHERE tblLists.ListType = 'File'
AND tblLists.tblFiles_FileID = tblFiles.FileID

OR tblLists.ListType = 'Page'
AND tblLists.tblPages_PageID = tblPages.PageID

OR tblLists.ListType = 'Link'

OR tblLists.ListType = 'Text'

ORDER BY tblLists.ListTitle

我现在需要的是将tblFileTypes.ReferenceID = tblFiles.FileTypes_ReferenceID放入查询中 - 我是否需要左连接左边的连接?! ......

2 个答案:

答案 0 :(得分:1)

是的,这是可能的。这种结构应该对你有所帮助。你必须弄清楚细节。

select yourFields 
from table1  t1 join table2 t2 on t1.something = t2.something
where someConditionsAreMet
and 
(
(someMoreConditionsAreMet)
or
(someOtherConditionsAreMet)
or 
(yetAnotherSetOfConditionsAreMet)
)

在select子句中,coalesce函数可以帮助您使用所需的任何条件逻辑。

答案 1 :(得分:0)

所以,我有点愚蠢......这似乎很有效,就像那个一样简单!

SELECT tblLists.ListType , tblLists.ListTitle , tblLists.LinkAddress , tblLists.Description , tblFiles.FileName , tblPages.PageTitle , tblPages.PagePath , tblFileTypes.FileTypeDescription , tblFileTypes.FileTypeIcon 

FROM tblLists

LEFT JOIN tblFiles ON tblLists.tblFiles_FileID = tblFiles.FileID 
LEFT JOIN tblFileTypes ON tblFiles.tblFileTypes_FileTypeID = tblFileTypes.FileTypeID
LEFT JOIN tblPages ON tblLists.tblPages_PageID = tblPages.PageID

WHERE tblLists.ListType = 'File'
AND tblLists.tblFiles_FileID = tblFiles.FileID
AND tblFiles.tblFileTypes_FileTypeID = tblFileTypes.FileTypeID

OR tblLists.ListType = 'Page' 
AND tblLists.tblPages_PageID = tblPages.PageID

OR tblLists.ListType = 'Link'

OR tblLists.ListType = 'Text'

ORDER BY tblLists.ListTitle

再次感谢Dan,它只是看到了为我触发它的WHERE / AND / OR!我进入了我的脑海,这将是非常复杂的! :)