SQL多对多查询问题

iro*_*ith 5 mysql sql many-to-many

我有三个表:视频,视频_类别和类别.

表格如下所示:

videos: video_id, title, etc...
videos_categories: video_id, category_id
categories: category_id, name, etc...
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我允许用户多选类别.当他们这样做时,我需要返回所有选定类别中的所有视频.

我最终得到了这个:

SELECT * FROM videos WHERE video_id IN (
    SELECT c1.video_id FROM videos_categories AS c1
    JOIN c2.videos_categories AS c2
    ON c1.video_id = c2.video_id
    WHERE c1.category_id = 1 AND c2.category_id = 2
)
Run Code Online (Sandbox Code Playgroud)

但是对于我添加到multiselect的每个类别,我必须在内部选择中添加一个连接:

SELECT * FROM videos WHERE video_id IN (
    SELECT c1.video_id FROM videos_categories AS c1
    JOIN videos_categories AS c2
    ON c1.video_id = c2.video_id
    JOIN videos_categories AS c3
    ON c2.video_id = c3.video_id
    WHERE c1.category_id = 1 AND c2.category_id = 2 AND c3.category_id = 3
)
Run Code Online (Sandbox Code Playgroud)

我不禁觉得这是真正错误的做法,但我试图找到正确的方法来阻止它.

KM.*_*KM. 6

如果这是主键:

 videos_categories: video_id, category_id
Run Code Online (Sandbox Code Playgroud)

然后GROUP BY和HAVING应该工作,试试这个:

SELECT
    * 
    FROM videos 
    WHERE video_id IN (SELECT 
                           video_id
                           FROM videos_categories
                           WHERE category_id IN (1,2,3)
                           GROUP BY video_id
                           HAVING COUNT(video_id)=3
                      )
Run Code Online (Sandbox Code Playgroud)