SQL重复指定查询条件时PHP返回非重复结果的问题求助
解决MySQL查询结果无法重复显示对应值的问题
这个问题其实很常见——你的SQL查询只会返回数据库中实际存在的唯一行,哪怕IN子句里有重复的username,因为数据库里username=2对应的记录只有一条,所以查询结果自然只有两行,最终JSON数组也就只有两个元素。
要实现按查询条件重复显示对应值,我们需要换个思路:先获取每个username对应的photo映射,再根据原始的用户名列表逐个取出对应的值,这样就能保留重复项了。
具体实现步骤
- 先把需要查询的用户名列表单独存为数组,方便后续遍历:
$targetUsernames = ['1', '2', '2']; - 调整SQL语句,只查询唯一的
username对应的photo(避免重复查询相同数据),同时做好SQL注入防护:// 提取唯一用户名,减少查询压力 $uniqueUsernames = array_unique($targetUsernames); // 转义处理防止SQL注入(如果用户名来自用户输入,这一步必须做) $escapedUsernames = array_map(function($name) use ($con) { return mysqli_real_escape_string($con, $name); }, $uniqueUsernames); $sql = "SELECT username, photo FROM table WHERE username IN ('" . implode("','", $escapedUsernames) . "')"; - 将查询结果转为用户名=>照片的关联数组,方便后续快速查找:
$photoMap = []; $result = mysqli_query($con, $sql); while($row = mysqli_fetch_array($result)){ $photoMap[$row['username']] = $row['photo']; } - 遍历原始的目标用户名列表,逐个取出对应的照片值,构建最终结果数组:
$res = []; foreach($targetUsernames as $username) { // 如果用户名在数据库中不存在,可设置默认值比如null $res[] = $photoMap[$username] ?? null; } echo json_encode($res);
为什么这个方案可行?
- 通过一次查询获取所有需要的
username映射,避免了重复查询数据库,提升效率 - 基于原始的重复用户名列表逐个取值,完美保留了你想要的重复项顺序和次数
- 加入了SQL注入防护,让代码更安全(尤其是当用户名来自用户输入时)
完整代码示例
$targetUsernames = ['1', '2', '2']; $uniqueUsernames = array_unique($targetUsernames); $escapedUsernames = array_map(function($name) use ($con) { return mysqli_real_escape_string($con, $name); }, $uniqueUsernames); $sql = "SELECT username, photo FROM table WHERE username IN ('" . implode("','", $escapedUsernames) . "')"; $photoMap = []; $result = mysqli_query($con, $sql); while($row = mysqli_fetch_array($result)){ $photoMap[$row['username']] = $row['photo']; } $res = []; foreach($targetUsernames as $username) { $res[] = $photoMap[$username] ?? null; } echo json_encode($res);
这样输出的JSON数组就会是["photo1的值", "photo2的值", "photo2的值"],完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者error.exe
相关产品推荐
相关产品推荐

