我正在使用关系型MySQL数据库建立一个人们可以通过上传各种媒体创建在线故事的网站:音频剪辑,照片,视频等。该网站将登录个人空间,人们可以在其中创建,查看并编辑故事。对于这个问题,假设数据库有4个表:memorybox(包含关于故事的元信息,即:标题,日期和描述),音频,照片和视频(后三者将所有媒体连接到内存盒中的一个故事) table - 单个媒体文件通过具有内存盒ID的列链接到故事。
我正在使用PHP选择与故事相关的所有媒体,故事的元数据,并导出到XML文件。从XML我将使用jquery来显示,首先是故事(某种图标,带有故事标题),然后,当点击故事图标时,故事视图中的所有媒体。
我想要的是将所有媒体文件与一个故事(及其元数据)相关联。我的问题是我无法获得我需要的XML结果,并且不确定问题是查询还是数据库结构。我试图选择IDS匹配的所有内容,但这为我提供了每个媒体文件的单独条目列表。我还尝试了LEFT JOIN将所有内容与内存盒ID相关联,但我仍然可以获得一个ID的多个条目。我试过GROUP BY,但这只给了我一行媒体数据。
是否有可以执行此操作的查询或是否需要重新考虑我的数据库结构?
谢谢谢丽尔答案 0 :(得分:1)
从您的问题判断,您还没有围绕关系数据库。您是否意识到过程代码和面向对象编程之间的区别? Going RealtionalDB是一个类似的步骤。
始终考虑数据集,即使该集仅包含一条记录。表是数据集,查询结果是另一个,视图是一个,连接是两个结合的。
至于你的问题: 据我所知,故事由memorybox表中的一条记录和任何媒体表中的一条或多条记录组成。
为此,您的表结构非常好。我想
table memoryboxes(id int, metadata varchar)
,
table fotos(memorybox_id int, thefoto clob)
,
table audios(memorybox_id int, theaudio club)
,
table videos(memorybox_id int, thevideo clob)
。
要获得“完整故事”,您最好根据memorybox_id从所有这些表中进行选择。这意味着4个查询(在一个事务中为了整洁)彼此之后。从这些结果集构建xml。
关于联接: (左)联接应该与您描述的完全一致。它结合了基于前提的数据集(在您的情况下,ID相同)。即使在“右侧”的数据集中没有匹配的记录,左连接也允许生成“左侧”数据集中的记录。想一想;这将为您提供与谓词匹配的数据集的所有排列。正是你所描述的。
至于分组: 一个分组(通过id我猜)将“滚动”一个数据集,你会注意到你需要在group-by子句或所谓的聚合函数中的group-by查询中包含列( count,min,max,...),表示他们参与了结果分组(在表中考虑复合键)或者它们的最终值将由基础数据集组中的所有数据组成。
长话短说:您的数据库结构很好,使用4个单独的查询(在事务中)来获取数据。
后续步骤: 稍后,当您要编写一个列出故事中相关媒体数量的查询时,请尝试阅读更多关于联接和分组的信息:
select
m.metadata,
count(f.id) as fotocount,
count(a.id) as audiocount,
count(v.id) as videocount
from
memoryboxes m
left join fotos f on f.memorybox_id=m.id
left join audios a on a.memorybox_id=m.id
left join videos v on v.memorybox_id=m.id
group by m.metadata