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有两种类型的动作,用户选择动作。然后,它将删除洛根的戏剧类型,并首先呼应结果