0

我正在为一个网站使用关系 MySQL 数据库,人们可以通过上传各种媒体来创建在线故事:音频剪辑、照片、视频等。该站点将提供一个个人空间的登录,人们可以在其中创建、查看和编辑故事。对于这个问题,假设数据库有 4 个表:memorybox(包含有关故事的元信息,即:标题、日期和描述)、音频、照片和视频(后三个将所有媒体都连接到 memorybox 中的一个故事表——单个媒体文件通过具有记忆框 ID 的列链接到故事)。

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

我想要的是将所有媒体文件与一个故事(及其元数据)相关联。我的问题是我无法完全获得所需的 XML 结果,并且不确定问题出在查询还是数据库结构上。我试图选择 IDS 匹配的所有位置,但这为我提供了每个媒体文件的一长串单独条目。我还尝试使用 LEFT JOIN 将所有内容与记忆框 ID 相关联,但我仍然会为一个 ID 获得多个条目。我尝试了 GROUP BY,但这只给了我一行媒体数据。

是否有可以执行此操作的查询,或者我是否需要重新考虑我的数据库结构?

谢谢,谢丽尔

4

1 回答 1

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。

至于连接:( 左)连接的行为应该与您描述的完全一样。它基于前提组合数据集(在您的情况下,ids 相等)。即使“右侧”的数据集中没有匹配的记录,左连接也允许生成“左侧”数据集中的记录。想想看;这将为您提供与您的谓词匹配的数据集的所有排列。正是你所描述的。

至于分组依据: 分组依据(我猜是 id)将“滚动”一个数据集,并且您会注意到,您需要在分组依据子句中或在分组依据查询中包含列一个所谓的聚合函数(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
于 2012-07-31T16:12:04.130 回答