我有3个表,Items
,FileLinks
和Files
,其中每个项目可以有多个与之关联的文件。
项目有ItemID和ItemName。
FileLinks是包含ItemID和FileID的Items和Files之间的链接表。
文件包含FileID,FileURL和FileCategory。
我想要一个查询列出所有项目(没有重复项)和指定类别的单个文件的URL,如果没有该类别的文件,则在URL字段中显示空白。
我从这开始:
select items.itemid, items.itemname, files.url
from items
inner join filelinks on items.itemid = filelinks.itemid
inner join files on filelinks.fileid = files.fileid
where files.filecategory = 1
但是,只显示具有该类别文件的项目,如果每个项目有多个文件,则隐藏那些不重复项目列表的项目。我需要所有项目,只需要该类别中的单个文件或空白。
示例数据:
items
ItemID ItemName
1 apple
2 orange
filelinks
itemid fileid
1 1
1 2
2 3
2 4
files
fileid category url
1 main apple.jpg
2 secondary apple2.jpg
3 main orange.jpg
4 secondary orange2.jpg
if category = main, then results should be
itemid itemname url
1 apple apple.jpg
2 orange orange.jpg
答案 0 :(得分:2)
执行LEFT JOIN
以获取没有任何文件链接或文件的项目:
select items.itemid, items.itemname, files.url
from items
left join filelinks on items.itemid = filelinks.itemid
left join files on filelinks.fileid = files.fileid
and files.filecategory = 1
要仅为某个项目获取一个文件,请执行GROUP BY
并选择MIN
一个:
select items.itemid, items.itemname, MIN(files.url)
from items
left join filelinks on items.itemid = filelinks.itemid
left join files on filelinks.fileid = files.fileid
and files.filecategory = 1
group by items.itemid, items.itemname