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

如何按类别分组查询并展示同类别关联数据?MySQL实现求助

解决SQL分组展示类别对应物品名称的问题

看起来你需要按类别分组展示对应的物品名称,当前代码的问题在于每一条记录都单独输出了类别,导致同类别重复显示。我来帮你修正这个问题,有两种常见的解决思路:

方法一:使用SQL的GROUP_CONCAT直接分组拼接(推荐)

这种方法让数据库直接帮你完成分组和字符串拼接,效率更高,代码也更简洁。

首先修改你的SQL查询语句:

SELECT categoryname, GROUP_CONCAT(nameofthing SEPARATOR ' - ') AS combined_names 
FROM thing 
WHERE tol_id='$bid' 
GROUP BY categoryname 
ORDER BY categoryname

这里GROUP_CONCAT会把同一个categoryname下的所有nameofthing用指定的分隔符(这里是' - ')拼接成一个字符串,AS combined_names给这个拼接后的字段起个别名方便PHP调用。

然后修改你的PHP代码:

$query = mysql_query("SELECT categoryname, GROUP_CONCAT(nameofthing SEPARATOR ' - ') AS combined_names FROM thing WHERE tol_id='$bid' GROUP BY categoryname ORDER BY categoryname");
if(mysql_num_rows($query) > 0){
    while($row = mysql_fetch_array($query)) {
        $categoryname = $row['categoryname'];
        $combinedNames = $row['combined_names'];
        // 注意把重复的id改成class,因为id在页面中必须唯一
        echo "<div class='stuff'> 
                <p>".$categoryname."</p> 
                <div class='rowstuff'> 
                    <div class='name'>".$combinedNames."</div> 
                </div> 
              </div>";
    }
}

这样每一个类别只会输出一次,对应的所有物品名称已经按要求拼接好了。

方法二:PHP循环中手动分组处理

如果因为某些原因不想用SQL的GROUP_CONCAT,也可以在PHP里手动跟踪当前类别,拼接名称:

$query = mysql_query("SELECT categoryname, nameofthing FROM thing WHERE tol_id='$bid' ORDER BY categoryname, nameofthing");
if(mysql_num_rows($query) > 0){
    $currentCategory = '';
    $names = [];
    while($row = mysql_fetch_array($query)) {
        $categoryname = $row['categoryname'];
        $name = $row['nameofthing'];
        
        if($categoryname != $currentCategory){
            // 如果是新的类别,先输出上一个类别的内容(如果有的话)
            if($currentCategory != ''){
                $combinedNames = implode(' - ', $names);
                echo "<div class='stuff'> 
                        <p>".$currentCategory."</p> 
                        <div class='rowstuff'> 
                            <div class='name'>".$combinedNames."</div> 
                        </div> 
                      </div>";
            }
            // 重置当前类别和名称数组
            $currentCategory = $categoryname;
            $names = [$name];
        } else {
            // 同一类别,添加名称到数组
            $names[] = $name;
        }
    }
    // 输出最后一个类别的内容
    if($currentCategory != ''){
        $combinedNames = implode(' - ', $names);
        echo "<div class='stuff'> 
                <p>".$currentCategory."</p> 
                <div class='rowstuff'> 
                    <div class='name'>".$combinedNames."</div> 
                </div> 
              </div>";
    }
}

额外注意点:

  • 你原代码里的$tname是未定义的变量,应该改成$row['nameofthing'](对应你的表字段)。
  • 循环里的id='rowstuff'和id='name'会导致页面出现多个相同的id,这不符合HTML规范,建议改成class属性。
  • 另外,mysql_*系列函数已经被废弃了,推荐使用mysqli_*或者PDO来操作数据库,安全性和兼容性更好。

内容的提问来源于stack exchange,提问作者Abhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:47:50