应该如何成为我的mysql表结构?

时间:2017-06-29 06:48:54

标签: php mysql phpmyadmin

这就是我想要的:

用户将在我的网站中发送一个或两个值,我会将它们存储在两个变量$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')

还有其他选择吗?

5 个答案:

答案 0 :(得分:3)

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

-----
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

答案 1 :(得分:2)

select distinct 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')

根据您的评论,试试这个:

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_tittle中的类型不应该重复。将它作为主键。

答案 2 :(得分:1)

  

但问题是,我无法实现上面用[前两个表]

解释的内容

是的,你可以。假设这两个表名为moviesmovie_genres,您可以选择使用以下两个标记的电影:

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'

See it for yourself here.

答案 3 :(得分:1)

尝试这样的事情:

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))

答案 4 :(得分:0)

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

电影表

 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

然后你的选择将链接到表

     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;
     }

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_name = ? 
           ';

           $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循环运行该函数,然后根据需要显示它们。

我希望这会有所帮助。