如何匹配两个SQL查询结果 实现悬停图片时显示对应上传者名称
问题原因及修正方案
现有代码的核心问题
- 图片查询后先执行了一次
$row=mysqli_fetch_array($rs),导致后续while循环直接跳过第一条查询结果,会丢失第一张图片 - 内层查询用户的SQL没有关联当前遍历到的图片的
user_id,每次都查询所有符合条件的用户,自然会输出全部用户名 - 在循环中反复执行SQL查询,会造成不必要的数据库性能开销,完全可以通过一次联表查询拿到所有需要的字段
- 内层
foreach遍历$rowz的逻辑错误,mysqli_fetch_array默认返回同时带索引和关联键的数组,遍历会重复输出同一个用户名两次
推荐修正方案(联表查询,性能更高逻辑更简单)
一次性查询所有有效图片和对应的上传者名称,无需嵌套查询:
// 联表查询直接拿到图片地址和对应上传者名称 $sql = "SELECT p.url, u.name FROM picture p LEFT JOIN user u ON p.user_id = u.user_id WHERE p.status = 1"; $rs = doQuery($db, $sql); // 遍历输出 while($row = mysqli_fetch_assoc($rs)) { // 如果仅需要基础悬停显示名称,直接用img自带的title属性即可实现 echo "<img class='picture__img' src='{$row['url']}' title='{$row['name']}' >"; // 如果需要自定义悬停样式,可以把图片和名称套在同一个容器里,后续用CSS控制hover时显示.picture__name即可 // echo "<div class='picture__wrapper'> // <img class='picture__img' src='{$row['url']}' > // <div class='picture__name'>{$row['name']}</div> // </div>"; }
mysqli_fetch_assoc 会仅返回关联键数组,避免默认mysqli_fetch_array返回索引+关联双份数据的冗余问题。
拆分查询的兼容方案(仅做参考,不推荐生产使用)
如果坚持要拆分两次查询,需要在内层查询时增加当前图片的user_id筛选条件:
$sql="SELECT * FROM picture WHERE status=1"; $rs=doQuery($db,$sql); // 删除多余的首次fetch,避免丢失第一条数据 while($row=mysqli_fetch_assoc($rs)){ echo"<img class='picture__img' src='{$row['url']}' >"; // 增加筛选条件,仅查询当前图片对应的用户 $sql="SELECT name FROM user WHERE user_id = {$row['user_id']}"; $rz=doQuery($db,$sql); $rowz=mysqli_fetch_assoc($rz); echo"<div class='picture__name'>{$rowz['name']}</div>"; }
内容的提问来源于stack exchange,提问作者Xenochrist
相关产品推荐
相关产品推荐

