Php 我的mysql表结构应该是怎样的?

Php 我的mysql表结构应该是怎样的?,php,mysql,phpmyadmin,Php,Mysql,Phpmyadmin,这就是我想要的: 用户将在我的网站中发送一个或两个值,我将它们存储在两个变量中$genres1和$genres2 比如:如果用户发送动作,那么我的代码将显示所有动作类型的电影。如果用户发送Action+Crime,则我的表将获取所有包含Action+Crime的电影 明白了吗 我当前的表结构是一对多关系,如下所示 tmdb_id movie_title ----------------------------- 1 Iron man 2

这就是我想要的:

用户将在我的网站中发送一个或两个值,我将它们存储在两个变量中
$genres1
$genres2

比如:如果用户发送动作,那么我的代码将显示所有动作类型的电影。如果用户发送Action+Crime,则我的表将获取所有包含Action+Crime的电影

明白了吗

我当前的表结构是一对多关系,如下所示

tmdb_id    movie_title
-----------------------------
1               Iron man
2               Logan
3               Batman
4               The hangover

tmdb_id      genres
-----------------------------
1            Action
1            Crime
2            Drama
2            Action
3            Crime
3            Action
4            Comedy
4            Drama
但这里的问题是,我不能用这个实现我上面解释的

第二种选择:我制作一张如下的表格:

movie_tile  genres1    genres2    genres3    genres4         
----------------------------------------------------
Logan       Action     Crime      Drama      Null         
Iron man    Action     Crime      Null       Null
我可以用这句话做我想做的事:

SELECT * FROM movies WHERE (genres1='$genres1' or genres2='$genres1' orgenres1='$genres3' or genres3='$genres1')
还有其他选项吗?

使用表格宽度样式 并使用另一个表将电影连接到任何类型

-----
movieid  title
-----
1        Logan
2        Smurf
-----

-----
genreid genre
-----
1       animated
2       blue people
-----


-----
movieid  genreid
-----
 1       1
 2       1
 2       2
-----
这样你就不会被限制在每部电影4种类型

现在我更好地理解了你的问题。 你就是这么做的,但是你把它放在了类型表之外

第二种选择是不好的,因为你只把自己限制在4个类别

这个连接到PHP吗?我认为最容易通过连接查询进一步解决这个问题,该查询在PHP中按电影和循环排序


你希望所有电影(根据用户要求)的类型都是犯罪和动作

SELECT mg.movieid, count(1), m.title
FROM movies_genres mg
JOIN movies m ON m.movieid  mg.movieid
WHERE mg.genreid = 1 OR mg.genreid =3
group by mg.movieid, m.title
HAVING COUNT(1) = 2
编辑:也可以查看其他类型

SELECT movies.movieid,movies.title, genres.genre
FROM movies
JOIN movie_genre mg ON mg.movieid = movies.movieid
JOIN genres on genres.genreid = mg.genreid
WHERE movie.movieid IN (
    SELECT mg.movieid
    FROM movies_genres mg
    WHERE mg.genreid = 1 OR mg.genreid =3
    GROUP BY mg.movieid
    HAVING COUNT(1) = 2
)
忘了提一下:count=2,意味着你给了2个genreid来寻找。这也可以是1、3或25,使用表宽类型 并使用另一个表将电影连接到任何类型

-----
movieid  title
-----
1        Logan
2        Smurf
-----

-----
genreid genre
-----
1       animated
2       blue people
-----


-----
movieid  genreid
-----
 1       1
 2       1
 2       2
-----
这样你就不会被限制在每部电影4种类型

现在我更好地理解了你的问题。 你就是这么做的,但是你把它放在了类型表之外

第二种选择是不好的,因为你只把自己限制在4个类别

这个连接到PHP吗?我认为最容易通过连接查询进一步解决这个问题,该查询在PHP中按电影和循环排序


你希望所有电影(根据用户要求)的类型都是犯罪和动作

SELECT mg.movieid, count(1), m.title
FROM movies_genres mg
JOIN movies m ON m.movieid  mg.movieid
WHERE mg.genreid = 1 OR mg.genreid =3
group by mg.movieid, m.title
HAVING COUNT(1) = 2
编辑:也可以查看其他类型

SELECT movies.movieid,movies.title, genres.genre
FROM movies
JOIN movie_genre mg ON mg.movieid = movies.movieid
JOIN genres on genres.genreid = mg.genreid
WHERE movie.movieid IN (
    SELECT mg.movieid
    FROM movies_genres mg
    WHERE mg.genreid = 1 OR mg.genreid =3
    GROUP BY mg.movieid
    HAVING COUNT(1) = 2
)
忘了提一下:count=2,意味着你给了2个genreid来寻找。这也可能是1、3或25

但这里的问题是,我无法实现我在[前两个表]中解释的内容

是的,你可以。假设这两个表分别称为
电影
电影类型
,您可以使用以下方法选择具有两个标记的电影:

SELECT movie_title FROM movies
  JOIN movie_genres genre1 USING (tmdb_id)
  JOIN movie_genres genre2 USING (tmdb_id)
WHERE genre1.genres = 'Action'
  AND genre2.genres = 'Crime'

但这里的问题是,我无法实现我在[前两个表]中解释的内容

是的,你可以。假设这两个表分别称为
电影
电影类型
,您可以使用以下方法选择具有两个标记的电影:

SELECT movie_title FROM movies
  JOIN movie_genres genre1 USING (tmdb_id)
  JOIN movie_genres genre2 USING (tmdb_id)
WHERE genre1.genres = 'Action'
  AND genre2.genres = 'Crime'

试试这样的方法:

tableA
Movie_ID    Movie_title
1               Iron man
2               Logan
3               Batman
4               The hangover

tableB
Genre_ID    Genre_title
1           Action
2           Crime
3           Drama
4           Comedy


tableC
ID  Movie_ID    Genre_ID
1   1          1
2   1          2
3   2          2
4   2          3
查询:

Select A.Movie_title,B.Genre_title
from tableC C
inner join tableA A on A.Movie_ID = C.Movie_ID
inner join tableB B on B.Genre_ID = C.Genre_ID
where
C.Genre_ID in (IFNULL(val1,0),IFNULL(val2,0))

试着这样做:

tableA
Movie_ID    Movie_title
1               Iron man
2               Logan
3               Batman
4               The hangover

tableB
Genre_ID    Genre_title
1           Action
2           Crime
3           Drama
4           Comedy


tableC
ID  Movie_ID    Genre_ID
1   1          1
2   1          2
3   2          2
4   2          3
查询:

Select A.Movie_title,B.Genre_title
from tableC C
inner join tableA A on A.Movie_ID = C.Movie_ID
inner join tableB B on B.Genre_ID = C.Genre_ID
where
C.Genre_ID in (IFNULL(val1,0),IFNULL(val2,0))
根据您的评论,尝试以下方法:

SELECT 
    a.tmdb_id, a.movie_tittle
FROM
    movie_tittle a inner join genre_tittle b
ON
    a.tmdb_id = b.tmdb_id
WHERE
    b.genres in ('Action', 'Crime')
GROUP BY 
    a.tmdb_id, a.movie_tittle
HAVING 
    count(a.tmdb_id) = 2
tmdb_id和表genre_title中的genre不应重复。将其作为主键

根据您的评论,尝试以下方法:

SELECT 
    a.tmdb_id, a.movie_tittle
FROM
    movie_tittle a inner join genre_tittle b
ON
    a.tmdb_id = b.tmdb_id
WHERE
    b.genres in ('Action', 'Crime')
GROUP BY 
    a.tmdb_id, a.movie_tittle
HAVING 
    count(a.tmdb_id) = 2

tmdb_id和表genre_title中的genre不应重复。将它作为主键。

您应该创建一个关系表来解决这样的问题

电影桌

 movie_id    movie_name       genre_id
    1        alien              2
    2        logan              1
    3        ps i love you      4
    4        click              3
然后你需要一个流派表

  genre_id    genre_type
      1           action
      2           sci fi
      3           comedy
      4           romance
类型表

  genre_id    genre_type
      1           action
      2           sci fi
      3           comedy
      4           romance
然后您的选择将链接到表

     function get_movies_by_genre($genre_id) {

      global $MySQLiConnect;

      $query = '
               SELECT *  
               FROM movies m
               INNER JOIN genre g ON (g.genre_id = m.genre_id) 
               WHERE g.genre_id = ? 
               ';

               $stmt = $DBConnect->stmt_init();
           if ($stmt->prepare($query)) {
               $stmt->bind_param("i", $genre_id);
               $stmt->execute();
               $result = $stmt->get_result();
               $rows = $result->fetch_all(MYSQLI_ASSOC);
               $stmt->close();
           }

         return $rows;
     }

这是一个基本函数,用于根据发送给它的类型id从电影表中获取所有信息

对于多个ID,您可以通过foreach循环运行函数,以获得所需的任意多个类型ID,然后根据需要显示它们


我希望这会有所帮助。

您应该创建一个关系表来解决这样的问题

电影桌

 movie_id    movie_name       genre_id
    1        alien              2
    2        logan              1
    3        ps i love you      4
    4        click              3
然后你需要一个流派表

  genre_id    genre_type
      1           action
      2           sci fi
      3           comedy
      4           romance
类型表

  genre_id    genre_type
      1           action
      2           sci fi
      3           comedy
      4           romance
然后您的选择将链接到表

     function get_movies_by_genre($genre_id) {

      global $MySQLiConnect;

      $query = '
               SELECT *  
               FROM movies m
               INNER JOIN genre g ON (g.genre_id = m.genre_id) 
               WHERE g.genre_id = ? 
               ';

               $stmt = $DBConnect->stmt_init();
           if ($stmt->prepare($query)) {
               $stmt->bind_param("i", $genre_id);
               $stmt->execute();
               $result = $stmt->get_result();
               $rows = $result->fetch_all(MYSQLI_ASSOC);
               $stmt->close();
           }

         return $rows;
     }

这是一个基本函数,用于根据发送给它的类型id从电影表中获取所有信息

对于多个ID,您可以通过foreach循环运行函数,以获得所需的任意多个类型ID,然后根据需要显示它们



我希望这能有所帮助。

机器人如何
加入
?加入如何解决我的问题@Jens sir?我试了5天,我不知道:/你的警告不太清楚。为什么要逃避行为和犯罪?正如我在你的例子中看到的,Logan有ID2和ID2=戏剧和动作的类型?这只是一个例子@Jensb,但如果你需要帮助,你必须给出一个符合你要求的例子如何加入机器人
加入
?加入如何解决我的问题@Jens先生?我试了5天,我不知道:/你的警告不太清楚。为什么要逃避行为和犯罪?正如我在你的例子中看到的,Logan有ID2和ID2=戏剧和动作的类型?这只是一个例子@Jensb,但如果你需要帮助,你必须给出一个符合你要求的例子。我使用的是非常类似的东西。但是我怎样才能用这个功能过滤东西呢?是的,连接到PHPSee这里我的代码,如何过滤代码中的数据?我使用的是第1个表结构这就是这里发生的事情:当我单独使用mg.genreid=1时,它会回显所有类型id为1的电影…足够公平吧?但它删除了同一部电影的其他类型。例如:如果Logan有两种类型的动作,用户选择动作。然后,它将从Logan中删除戏剧类型,并响应我的第一个想法,即使用上面的查询作为子查询,只选择电影ID。目前时间有限。以后可能会将其添加到查询中,我使用的是非常类似的东西。但是我怎样才能用这个功能过滤东西呢?是的,连接到PHPSee这里我的代码,如何过滤代码中的数据?我使用的是第1个表结构这就是这里发生的事情:当我单独使用mg.genreid=1时,它会回显所有类型id为1的电影…足够公平吧?但它删除了同一部电影的其他类型。例如:如果Logan有两种类型的动作,用户选择动作。然后,它将删除洛根的戏剧类型,并首先呼应结果