查找连接到多个类别(1:N Relation)mysql的视频

时间:2015-02-19 15:46:35

标签: php mysql

我必须选择与许多类别相关的所有视频(1:N关系)。 但最后我只想要这些与所有特定类别相关的视频。

例如:

请求:cat [] = 5& cat [] = 6

结果:所有视频,分别为5和6类

事实上,我知道如何在2个给定的类别中处理这个问题(IN Statement,WHERE Exists等)。但我们希望尽可能动态地做到这一点。这意味着,客户一次可以选择约30个类别。 在这种情况下,我看到一点性能问题。 目前我在PHP中处理这些问题,我在其中构建了几个数组,以针对每个选定的类别验证每个选定的视频(IN选择的结果)。 但当然我还有其他问题。例如分页,限制等。我认为很多开销。 我的另一个想法是创建一个cache_table,其中类别被连接并存储在一个额外的列中,我将使用INSTR或FULLTEXT搜索进行查询。

有没有人知道更好的方法来处理这样的查询?

2 个答案:

答案 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;