我很困惑,这就是我想要的:
用户将使用tag1
tag1
或tag2
和GET method
)
这是我的表结构的样子:
表名:" tmdb_movies"
tmdb_id movie_title
1 The Dark Knight
2 Now you see me
3 Logan
表名:"标记"
tmdb_id tag
1 Crime
1 Drama
1 Action
2 Crime
2 Comedy
3 Action
现在,如果用户选择$tag1
作为犯罪,并选择$ tag2
作为行动,那么"黑暗骑士"电影会回显,因为它包含两个标签。
编辑:这是我的代码:
$stmt = $conn->prepare("SELECT tmdb_movies.movie_title, tmdb_movies.tmdb_id,GROUP_CONCAT(DISTINCT tag.tag_name SEPARATOR ', ') AS tag
FROM tmdb_movies
JOIN tag ON tag.tag_tmdb_id=tmdb_movies.tmdb_id
GROUP BY tmdb_movies.movie_title,tmdb_movies.tmdb_id
");
答案 0 :(得分:1)
根据您的代码:
$stmt = $conn->prepare("SELECT tmdb_movies.movie_title, tmdb_movies.tmdb_id,GROUP_CONCAT(DISTINCT tag.tag_name SEPARATOR ', ') AS tag
FROM tmdb_movies
JOIN tag ON tag.tag_tmdb_id=tmdb_movies.tmdb_id
WHERE tag IN (:tag1,:tag2)
GROUP BY tmdb_movies.movie_title,tmdb_movies.tmdb_id
");
$stmt->bindParam(":tag1",$tag1);
$stmt->bindParam(":tag2",$tag2);
如果您要搜索的标记数超过2个
,请使用此选项如果您有可变数量的标签,用户可以搜索,您必须更加狡猾。您需要使用与要搜索的标记一样多的参数(?)生成查询。然后你可以通过循环绑定:
$searchTags = [ "tag1", "tag2", "tag3",...., "tagN" ];
$stmt = $conn->prepare("SELECT tmdb_movies.movie_title, tmdb_movies.tmdb_id,GROUP_CONCAT(DISTINCT tag.tag_name SEPARATOR ', ') AS tag
FROM tmdb_movies
JOIN tag ON tag.tag_tmdb_id=tmdb_movies.tmdb_id
WHERE tag IN (".implode(",",array_fill(0,count($searchTags)),"?") .")
GROUP BY tmdb_movies.movie_title,tmdb_movies.tmdb_id
");
foreach ($searchTags as $index => $tag) {
$stmt->bindValue($index+1,$tag); //bindValue is important.
}
答案 1 :(得分:0)
首先以CSV
格式获取所有标记数据,然后运行此查询
SELECT `tmdb_movies`.`movie_title` FROM `tmdb_movies` LEFT JOIN `tag` ON
`tag`.`tmdb_id` = `tmdb_movies`.`tmdb_id` WHERE `tag`.`tag` IN ($tag1, $tag2)