2012-07-31 75 views
0

我正在使用关系型MySQL数据库作为网站,人们可以通过上传各种媒体来创建在线故事:音频剪辑,照片,视频等。将登录到个人空间,人们可以创建,查看和编辑故事。对于这个问题,我们假设数据库有4个表格:内存盒(包含关于故事的元信息,例如:标题,日期和描述),音频,照片和视频(后三者将所有媒体连接到内存盒中的一个故事表 - 单个媒体文件通过具有存储箱ID的列链接到故事)。将多个表格中的媒体与另一个表格中的元信息相关联的MySQL查询

我使用PHP来选择与故事和故事的元数据相关的所有媒体,并导出到XML文件。从XML中,我将使用jQuery来显示,首先,故事(某种图标和故事标题),然后在单击故事图标时显示故事视图中的所有媒体。

我想要的是将所有媒体文件与只有一个故事(及其元数据)相关联。我的问题是,我无法完全得到我需要的XML结果,而且不确定问题是出现在查询还是数据库结构中。我试图选择所有IDS匹配的地方,但是这给了我一个长长的每个媒体文件的单独条目列表。我也尝试过使用LEFT JOIN将所有内容与一个内存盒ID关联起来,但我仍然得到了一个ID的多个条目。我试过GROUP BY,但是这只给了我一行媒体数据。

有没有可以做到这一点的查询,还是我需要重新考虑我的数据库结构?

感谢,谢丽尔

+0

你有一个故事有很多媒体数据,但你希望它只返回一行(条目)?是对的吗?!你可以发布你的SQL这个查询吗? – 2012-07-31 15:16:21

回答

1

从你的问题来看你还没有缠关系数据库你的头呢。你是否意识到程序代码和面向对象编程之间的区别?去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相等)。左连接允许在左侧的数据集中记录,即使在右侧的数据集中没有匹配的记录。想想看,这会给你所有与你的谓词相匹配的数据集。完全是你描述的。

至于分组依据: A组由(按id我猜的)会“滚”的数据集起来,你会注意到你被要求具有在列组通过查询无论是在或者在所谓的集合函数(count,min,max,...)中,这意味着他们参与了结果分组(认为表中的组合键)或者它们的最终值将由所有数据组成在底层数据集组中。

长话短说:你的db结构很好,使用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 
+0

非常感谢您考虑的答案。这非常有帮助。 --Cheryl – cdonahue 2012-07-31 17:26:14

相关问题