如何在PHP操作的MySQL表中查询同时包含指定多名演员的电影
解决方案
完全可以通过单次MySQL查询实现需求,无需分别查询结果后再做数组比对,查询性能和代码简洁度都更高,以下是两种常用实现方案:
方案1:分组聚合筛选(推荐,扩展性更强)
实现逻辑
先过滤出所有包含目标演员的参演记录,按电影ID分组后筛选出分组内不重复演员数量刚好等于目标演员总数的分组,即为同时包含所有指定演员的电影。
示例SQL(以查询同时包含Bob Peck和Janet McTeer的电影为例)
SELECT movieID FROM movieCast WHERE idNum IN ('Bob Peck', 'Janet McTeer') GROUP BY movieID HAVING COUNT(DISTINCT idNum) = 2;
注:
DISTINCT用于避免同一个演员在同一部电影中饰演多个角色导致计数错误,如果你的表已做movieID + idNum唯一约束,可省略DISTINCT。如果需要查询同时包含N个演员的电影,只需修改IN中的参数列表,同时将HAVING后的计数改为N即可。
方案2:自联结查询
实现逻辑
将演员表和自身做内联结,关联条件为电影ID相同,分别在两张关联表中匹配不同的目标演员,最终返回的去重电影ID即为符合要求的结果。
示例SQL
SELECT DISTINCT t1.movieID FROM movieCast t1 INNER JOIN movieCast t2 ON t1.movieID = t2.movieID WHERE t1.idNum = 'Bob Peck' AND t2.idNum = 'Janet McTeer';
PHP调用示例(PDO预处理,避免SQL注入)
// 数据库连接配置请替换为实际值 $pdo = new PDO('mysql:host=127.0.0.1;dbname=movie_db;charset=utf8mb4', 'root', 'your_password'); // 两个目标演员 $actor1 = 'Bob Peck'; $actor2 = 'Janet McTeer'; $sql = "SELECT movieID FROM movieCast WHERE idNum IN (?, ?) GROUP BY movieID HAVING COUNT(DISTINCT idNum) = 2"; $stmt = $pdo->prepare($sql); $stmt->execute([$actor1, $actor2]); // 获取符合要求的所有电影ID数组 $matchMovies = $stmt->fetchAll(PDO::FETCH_COLUMN);
内容的提问来源于stack exchange,提问作者Danielle Stolys
相关产品推荐
相关产品推荐

