如何使用PHP和MySQL查询同时拥有多个指定idSkill的idUser
解决方案
1. 编写MySQL查询语句
有两种常用的实现方式,都可以得到你要的结果:
方式1:GROUP BY + HAVING聚合查询(推荐,扩展性更强)
SELECT idUser FROM skills WHERE idSkill IN (4, 9) GROUP BY idUser HAVING COUNT(DISTINCT idSkill) = 2;
说明:
- 如果你的表已经对
idUser和idSkill做了唯一约束,不存在同一个用户同一个技能重复录入的情况,可以去掉DISTINCT,直接写COUNT(idSkill) = 2即可 - 后续如果需要查询同时匹配N个技能的用户,只需要修改IN里的技能ID列表,再将HAVING后的数字改为对应的N即可,不需要调整其他逻辑
方式2:表自连接查询
SELECT DISTINCT s1.idUser FROM skills s1 INNER JOIN skills s2 ON s1.idUser = s2.idUser WHERE s1.idSkill = 4 AND s2.idSkill = 9;
2. PHP代码实现
以下示例均使用安全的查询逻辑编写,避免SQL注入风险:
示例1:基于MySQLi扩展实现
<?php // 数据库连接配置,替换为你自己的配置 $host = '127.0.0.1'; $user = '数据库用户名'; $password = '数据库密码'; $dbname = '数据库名'; // 建立连接 $conn = new mysqli($host, $user, $password, $dbname); if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 执行查询 $sql = "SELECT idUser FROM skills WHERE idSkill IN (4,9) GROUP BY idUser HAVING COUNT(DISTINCT idSkill) = 2"; $result = $conn->query($sql); $idUsers = []; if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $idUsers[] = $row['idUser']; } } // 输出结果,得到的$idUsers就是[8,32] print_r($idUsers); // 关闭连接 $conn->close(); ?>
示例2:基于PDO扩展实现
<?php // 数据库连接配置,替换为你自己的配置 $host = '127.0.0.1'; $user = '数据库用户名'; $password = '数据库密码'; $dbname = '数据库名'; try { $conn = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT idUser FROM skills WHERE idSkill IN (4,9) GROUP BY idUser HAVING COUNT(DISTINCT idSkill) = 2"; $stmt = $conn->query($sql); // 直接提取所有符合要求的idUser为一维数组 $idUsers = $stmt->fetchAll(PDO::FETCH_COLUMN, 0); print_r($idUsers); } catch(PDOException $e) { echo "查询错误: " . $e->getMessage(); } $conn = null; ?>
内容的提问来源于stack exchange,提问作者nusima
相关产品推荐
相关产品推荐

