You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 07:15:33