PHP查询MySQL表中重复course_id并输出完整列表的方法
问题根因
你的结果遍历逻辑存在赋值错误:循环读取每一行结果时,你每次都直接对$data变量整体赋值,会覆盖之前循环存入的所有值,循环结束后$data仅会保留最后一条匹配的course_id,因此只能输出单个值。
修复方案
只需要把循环内的覆盖赋值改为数组追加即可,完整可运行代码如下:
<?php $servername = "localhost"; $username = "root"; $password = ""; $db = "db_lms"; // 初始化数据库连接 $conn = new mysqli($servername, $username, $password, $db); // 连接校验 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $query = $conn->query("SELECT course_id from enrol group by course_id having count(*)>1"); $data = []; // 逐行读取结果集 while($row = mysqli_fetch_assoc($query)) { // 向数组末尾追加当前course_id,不要直接覆盖整个$data变量 $data[] = $row['course_id']; } // 输出你预期的"1, 2, 8"格式 echo implode(', ', $data); // 如果需要JSON格式输出,替换为下面这行即可 // echo json_encode($data); ?>
优化点:将原先的
mysqli_fetch_array替换为mysqli_fetch_assoc,该方法仅返回字段名作为键的关联数组,没有冗余的数字索引数据,执行效率更高,完全匹配你当前按字段名取值的场景。
可选简化方案
如果你不需要对单个course_id做二次处理,仅需要最终的逗号分隔字符串,可以直接在SQL层用GROUP_CONCAT完成拼接,省去PHP循环的步骤:
<?php $servername = "localhost"; $username = "root"; $password = ""; $db = "db_lms"; $conn = new mysqli($servername, $username, $password, $db); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 子查询先筛选出符合条件的course_id,再直接拼接为字符串 $query = $conn->query("SELECT GROUP_CONCAT(course_id SEPARATOR ', ') as course_list FROM (SELECT course_id FROM enrol GROUP BY course_id HAVING COUNT(*) > 1) AS temp_res"); $row = mysqli_fetch_assoc($query); echo $row['course_list']; // 直接输出1, 2, 8 ?>
两种方案都能满足需求:遍历追加的方式灵活性更高,适合后续需要对每个course_id做单独逻辑处理的场景;SQL直接拼接的方式代码更简洁,适合仅需输出最终拼接结果的场景。
内容的提问来源于stack exchange,提问作者Jadey
相关产品推荐
相关产品推荐

