这就是我想要的:
用户将在我的网站中发送一个或两个值,我会将它们存储在两个变量$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')
还有其他选择吗?
答案 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)
但问题是,我无法实现上面用[前两个表]
解释的内容
是的,你可以。假设这两个表名为movies
和movie_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'
答案 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循环运行该函数,然后根据需要显示它们。
我希望这会有所帮助。