当前位置: 首页 > 知识库问答 >
问题:

MySQL多对多搜索

微生博简
2023-03-14

我已经开始开发我的第一个MySQL数据库,我遇到了一个简单的问题。

我将我的电影按“多对多”关系进行分类:

'movies' Table
+---------+-------------------+
|movie_id |movie_title        |
+---------+-------------------+
|1        |Indiana Jones      |
|2        |Shaun of the Dead  |
+---------+-------------------+

'genres' table
+---------+-----------+
|genre_id |genre_name |
+---------+-----------+
|1        |adventure  |
|2        |comedy     |
|3        |horror     |
+---------+-----------+

'movie_genres' table
+---------+---------+
|movie_id |genre_id |
+---------+---------+
|1        |1        |
|2        |2        |
|2        |3        |
+---------+---------+

我试图做的是按类型搜索我的电影表,并显示每部电影的所有类型,例如:

Searching 'horror'

+------------------+---------------+
|movie_title       |genre_names    |
+------------------+---------------+
|Shaun of the Dead |comedy, horror |
+------------------+---------------+

这是一个我用来搜索恐怖电影的查询


    SELECT m.movie_title, GROUP_CONCAT(g.genre_name SEPARATOR ', ') as genre_names
    FROM movies m
    LEFT JOIN genre_movies gm ON gm.movie_id = m.movie_id
    LEFT JOIN genres g ON g.genre_id = gm.genre_id
    GROUP BY m.movie_id
    HAVING genre_names LIKE '%horror%'

我遇到的问题是,这个查询在筛选之前检索所有表的全部,我收集的结果非常低效。有没有更好的方法可以在显示所有相关类型的同时按一种类型搜索?

共有3个答案

潘琨
2023-03-14
SELECT m.movie_title, GROUP_CONCAT(g.genre_name SEPARATOR ', ') as genre_names
FROM  movies m
      INNER JOIN
      (
        SELECT gm.movie_id
        FROM   genre_movies gm 
               INNER JOIN genres g 
                  ON g.genre_id = gm.genre_id
        WHERE  g.genre_name = 'horror'
        GROUP BY gm.movie_id
      ) a ON a.movie_id = m.movie_id
      INNER JOIN genre_movies gm ON gm.movie_id = m.movie_id
      INNER JOIN genres g ON g.genre_id = gm.genre_id
GROUP BY m.movie_id
  • SQLFiddle演示
楚浩然
2023-03-14

你为什么不把genre_id放在电影桌上?

大概是这样的:

'movies' Table
+---------+------------+---------------------+
|movie_id |movie_genre |movie_title          |
+---------+----------------------------------+
|1        |1           | Indiana Jones       |
|2        |2 ,3        | Shaun of the Dead   |
+---------+----------------------------------+

所以你只需要两张桌子。并且可以很容易地过滤查询中的数据。

我试图做的是按类型搜索我的电影表,并显示每部电影的所有类型,例如:

可能是这样的:

SELECT fields FROM table WHERE movie_genre LIKE %movie_genre_id%
林曦之
2023-03-14

试试这个:

SELECT m.movie_title, A.genre_names
FROM movies m
INNER JOIN (SELECT gm.movie_id, GROUP_CONCAT(g.genre_name SEPARATOR ', ') AS genre_names
    FROM genre_movies gm INNER JOIN genres g ON g.genre_id = gm.genre_id
    GROUP BY gm.movie_id) AS A ON m.movie_id = A.movie_id 
WHERE genre_names LIKE '%horror%'
 类似资料:
  • 我在Books表和Authors表之间有多对多的关系。透视表(author_book)包含author_id和book_id。

  • 问题内容: 仍在学习MySQL的绳索,我试图找出如何进行涉及多对多的特定选择。如果表名太通用,我深表歉意,我只是在做一些自制的练习。我尽力成为一名自学者。 我有3个表,其中一个是链接表。如何编写 “显示哪些用户同时拥有HTC和Samsung手机” (他们拥有2部手机)的语句。我猜答案在WHERE语句中,但我不知道该怎么写。 问题答案: 关键是在GROUP BY / HAVING中使用COUNT个D

  • 问题内容: 我有一个包含两个主表和一个数据库。它们之间存在多对多的关系。我想知道的是如何使用SQL使用多个标签搜索笔记? 例如,如果我有一个带有三个标签“一个”,“两个”和“三个”的注释“ test”,而我有一个带有标签“一个”和“两个”的第二个注释“ test2”,那么将执行什么SQL查询找到与标签“一个”和“两个”相关联的所有注释? 问题答案: 要获取 同时 带有标签“ One”和“ Two”

  • 问题内容: 有点复杂的问题,但是,基本上我有很多表: 它是和关系的列表。我需要查询以查找word_a和word_b之间的关系是否存在。如果单词可以是单词A或单词b,那么正确的语法是什么? 在我的脑海里 这似乎不起作用,因为我得到了任何一场比赛的结果。有人熟悉这种情况并知道正确的语法吗? 提前致谢。 问题答案: 这应该工作:

  • 问题内容: 我从来没有真正听到过关于这个问题的直接答案,我只需要FULLTEXT搜索包含多个单词“ Firstname Lastname”的几列 但是,如果我在此处输入多个单词,它将无法运行查询。 问题答案: 如果要进行精确搜索:

  • 问题内容: 我正在努力创建一个搜索多个单词的搜索。我的第一次尝试没有任何结果,结果如下: 我还尝试了以下方法,这些方法产生了结果,但是正如您可以想象的那样,我输入的每个单词都得到了重复的结果: 我对如何进行此操作非常迷惑,不胜感激。 编辑: 问题答案: 我已经在同一个主题(搜索关键字)上工作了一段时间,这是我的工作方式: -现在这就是我尝试使用FULLTEXT搜索运行它的样子:但是您应该将表类型设