如何按类别分组查询并展示同类别关联数据?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
相关产品推荐
相关产品推荐

