MySQL查询将多个表中的媒体与另一个表中的元信息关联

MySQL查询将多个表中的媒体与另一个表中的元信息关联,mysql,xml,Mysql,Xml,我正在使用关系型MySQL数据库创建一个网站,人们可以通过上传各种媒体(音频剪辑、照片、视频等)来创建在线故事。该网站将登录到个人空间,人们可以在其中创建、查看和编辑故事。对于这个问题,假设数据库有4个表:memorybox,其中包含有关故事的元信息,即:标题、日期和描述、音频、照片和视频。后三个表将所有媒体连接到memorybox表中的一个故事-单个媒体文件通过带有memorybox ID的列链接到一个故事 我正在使用PHP选择与故事相关联的所有媒体,以及故事的元数据,并将其导出为XML文件。

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

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

我想要的是将所有媒体文件仅与一个故事及其元数据关联。我的问题是,我不能完全获得所需的XML结果,并且不确定问题是在于查询还是数据库结构。我尝试选择所有ID匹配的位置,但这给了我一个长长的列表,列出了每个媒体文件的单独条目。我还尝试使用左连接将所有内容与memorybox ID关联,但我仍然会为一个ID获取多个条目。我尝试了GROUP BY,但只提供了一行媒体数据

是否有一个查询可以做到这一点,或者我需要重新考虑我的数据库结构


谢丽尔,谢谢你。从你的问题来看,你还没有完全了解关系数据库。你意识到过程代码和面向对象编程之间的区别了吗?进入RealityDB在规模上是一个类似的步骤

始终考虑数据集,即使该集只包含一条记录。一个表是一个数据集,一个查询结果是另一个,一个视图是一个,一个连接是两个数据集的组合

关于你的问题: 我知道一个故事由memorybox表中的一条记录和任何媒体表中的一条或多条记录组成

对于这一点,您的表结构非常好。我想 表memoryboxesid int,元数据varchar, 表FOTOSMORYBOX_id int,本文件clob, table Audiosemorybox_id int,音频俱乐部, 表videosmemorybox\u id int,视频clob

要获得“完整故事”,最好根据memorybox_id从所有这些表中进行选择。这意味着在一个事务中进行4次查询,以确保彼此之间的整洁。从这些结果集生成xml

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

至于团体BY: group by id我猜将“滚动”一个数据集,正如您注意到的,您需要在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

您是否有一个故事的多个媒体数据,但希望它只返回一个单行条目?是这样吗?!你能为这个查询发布你的SQL吗?非常感谢你深思熟虑的回答。这很有帮助-谢丽尔