哪个Join我需要使用PHP过滤SQL中的数据?

时间:2017-06-27 13:28:56

标签: php mysql join

我很困惑,这就是我想要的:

用户将使用tag1

发送1或2个值(仅限tag1tag2GET 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


");

2 个答案:

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