使用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>
只有零件的位置和顺序是动态的。通过将条件名称(c1,c2)替换为其对应的SQL副本来创建where子句。对于上面的示例,将生成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')
查询时,每个文件将返回许多行。在遍历结果的同时,原始数据中包含的“新”数据将被添加以创建对象。
当筛选器包含一对多条件时,查询将分两步完成。首先,将检索所有视频的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的文件吗? (可能不多)。