我将所有视频和每个视频的详细信息存储在数据库中。我有一些表:
每个视频都有编码为1080和720的文件,并且每个视频都以三种不同的比特率进行编码,并且这些比特率中的每一个都再次使用WebM和MP4进行编码。因此,每个视频条目的video_file中有六个条目。所以我的查询每个视频返回12行。
我看到的问题是,每行都包含所有信息,而不仅仅是“neccecary”信息。例如:
| id | name | playlist | file | quality | size | type |
---------------------------------------------------------------------
1 video1 funny videos file1 3 720 MP4
1 video1 funny videos file2 2 720 MP4
1 video1 funny videos file3 1 720 MP4
1 video1 funny videos file4 3 1080 MP4
1 video1 funny videos file5 2 1080 MP4
1 video1 funny videos file6 1 1080 MP4
1 video1 funny videos file7 3 1080 WebM
1 video1 funny videos file8 2 1080 WebM
1 video1 funny videos file9 1 1080 WebM
1 video1 funny videos file10 3 720 WebM
1 video1 funny videos file11 2 720 WebM
1 video1 funny videos file12 1 720 WebM
这是一个示例输出。我认为更有效的是对结果进行分组,以便您不会在行与行之间获得冗余信息,毕竟,您将使用PHP或您正在使用的语言对此信息进行分组以便能够使用它一点都不。
我认为更有效的例子:
| id | name | playlist | file | quality | size | type |
---------------------------------------------------------------------
1 video1 funny videos file1 3 1080 WebM
file2 MP4
file3 720 WebM
file4 MP4
file5 2 1080 WebM
file6 MP4
file7 720 WebM
file8 MP4
file9 1 1080 WebM
file10 MP4
file11 720 WebM
file12 MP4
通过这种方式,您可以轻松设置与列名对应的一些变量:
id, name, playlist, file, quality, size, type
while (record = fetchRecord)
id = record.id or id
name = record.name or name
playlist = record.playlist or playlist
file = record.file or file
quality = record.quality or quality
size = record.size or size
type = record.type or type
// Now you have filled the variables with the exact information you had in the first recordset example, but without wasting so much unnecessary bandwidth and processing power.
现在,我正在添加另一个表格,其中包含在视频播放期间弹出的音符,因此如果视频上有x个音符,则每个视频将返回12x行。
这太疯狂了!我错过了什么吗?我在这里“解释”实际上可以做什么?或者,最好是让每个视频返回12行,就像今天一样,并通过每个视频获取笔记,或者是什么?
这是我的问题的结束,非常感谢您一直阅读本文!
答案 0 :(得分:1)
执行此类操作的另一种方法是在不同的列中使用GROUP_CONCAT
函数,并在重复的列上进行分组。这将在输出中创建一个分隔的字符串列,您需要在PHP中进行解析;但是,它会将行数减少到只有非分组列的唯一组合数。例如:
select name, playlist, GROUP_CONCAT(file, '|', quality, '|', size, '|', type SEPARATOR '/') AS delimited_pairs
from video
group by name, playlist;
在上面的示例中,生成的delimited_pairs
列将使用管道字符分隔每个名称/播放列表(分组列)的每个唯一列值,并且这些唯一组合中的每一个都将由正斜杠分隔。 / p>
答案 1 :(得分:0)
我认为您的数据布局存在问题。您的“冗余数据”不应该进入video_file
表,而应该进入video
表,因为它是引用视频的信息,而不是文件!如果你这样做,这个数据库方案在一致性方面也是不好的。会更新视频所属的播放列表中的信息,您必须为所有文件执行此操作...