与 pms-mlx ,我一直在开发一个媒体库来扩展 ps3 media server 的功能一段时间以来,最近才发现我的概念中的一个主要流程;如果使用多个一对多属性,则无法进行过滤。
在提问之前,我应该解释一下它是如何工作的。
这是代码相关部分的数据库结构。 h2正在使用。
每个视频都是一个文件,并且具有 0-n 个附加属性。
存储某些视频后,可以通过设置条件在仅显示所有条目的子集的文件夹中查看和播放它们。这是一个例子:
要检索所需的文件,查询的构造如下
SELECT <all_properties>
FROM FILE, VIDEO
LEFT JOIN VIDEOAUDIO ON VIDEO.FILEID = VIDEOAUDIO.FILEID
LEFT JOIN SUBTITLES ON VIDEO.FILEID = SUBTITLES.FILEID
LEFT JOIN FILETAGS ON VIDEO.FILEID = FILETAGS.FILEID
LEFT JOIN FILEPLAYS ON VIDEO.FILEID = FILEPLAYS.FILEID
WHERE <whereClause>
ORDER BY <orderBy>
只有部件的位置和顺序是动态的。 where 子句是通过将条件名称 (c1, c2) 替换为相应的 SQL 对应项来创建的。对于上面的示例,将生成此 where 子句:
WHERE VIDEO.FILEID = FILE.ID
AND ((VIDEO.NAME LIKE 'A%' OR VIDEO.NAME LIKE 'B%')
AND FILE.DATEINSERTEDDB > '2011-09-28 18:48:43')
执行查询时,每个文件都会返回许多行。在迭代结果时,将添加原始数据中包含的"new"数据来创建对象。
当过滤器包含一对多条件时,查询分两步完成。首先,检索所有视频的 ID,然后加载数据。
到目前为止我一直缺少的是,如果有例如两个文件标签都应该满足,没有任何作用了。
如果设置过滤器:
产生这个 where 子句:
WHERE VIDEO.FILEID = FILE.ID
AND ((VIDEO.FILEID = FILETAGS.FILEID
AND FILETAGS.KEY = 'Actor' AND FILETAGS.VALUE LIKE 'A%')
AND (VIDEO.FILEID = FILETAGS.FILEID
AND FILETAGS.KEY = 'Actor' AND FILETAGS.VALUE LIKE 'B%'))
这是永远不会满足的,因为一行仅包含一个键和一个值字段。
是否可以创建一个查询,其中单个视频的所有数据都包含在一行中?或者用其他东西替换生成的 SQL 条件?
我不是数据库专家,很乐意从有好主意的人那里得到:)
生成where子句的代码位于DBFileInfo.java第445行的formatFilter方法中。数据的加载在DBVideoFileInfo.java的第189行完成。如果有人有兴趣查看代码。
最佳答案
对于问题的简单示例来说,复杂的表关系有点令人困惑,但是您不能只建立一堆标准吗?
WHERE FILEID IN (SELECT [all files that have brad])
AND FILEID IN (SELECT [all files that have angelina])
AND FILEID IN (SELECT [all files that have elvis])
这肯定只会返回包含 Brad、Angelina 和 Elvis 的文件吗? (可能不多)。
关于java - 媒体数据库中的一对多过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8301418/