我必须选择与许多类别相关的所有视频(1:N关系)。 但最后我只想要这些与所有特定类别相关的视频。
例如:
请求:cat [] = 5& cat [] = 6
结果:所有视频,分别为5和6类
事实上,我知道如何在2个给定的类别中处理这个问题(IN Statement,WHERE Exists等)。但我们希望尽可能动态地做到这一点。这意味着,客户一次可以选择约30个类别。 在这种情况下,我看到一点性能问题。 目前我在PHP中处理这些问题,我在其中构建了几个数组,以针对每个选定的类别验证每个选定的视频(IN选择的结果)。 但当然我还有其他问题。例如分页,限制等。我认为很多开销。 我的另一个想法是创建一个cache_table,其中类别被连接并存储在一个额外的列中,我将使用INSTR或FULLTEXT搜索进行查询。
有没有人知道更好的方法来处理这样的查询?
答案 0 :(得分:0)
我认为你应该创建一个包含可能类别的表格,一个包含视频的表格,以及一个链接2的表格。
Categories Videos VideoCategories
1 cats 1 Cat being lazy 1 1
2 dogs 2 Dog barking 2 2
3 Dog chasing Cat 3 1
3 2
如果您为这些表编制索引,则查询速度非常快:
Select * from videos
where videoId in
( select videoId, count(*) numberOfMatches
from VideoCategories
where categoryid in (1,2)
group by videoId
having numberOfMatches >= 2 )
我并不是说这是最快的解决方案,但我认为这是一个很好的入门方式,它绝对比全文搜索更快
答案 1 :(得分:0)
由于IN ( SELECT ... )
的优化效果非常差,因此请将其转换为JOIN:
Select b.*
from videos b
JOIN
( SELECT videoId, count(*) numberOfMatches
from VideoCategories
where categoryid in (5,6)
group by videoId
having numberOfMatches >= 2
) a USING videoId;