MySQL:每个分组只打印一次数据

Posted

技术标签:

【中文标题】MySQL:每个分组只打印一次数据【英文标题】:MySQL: printing data just once for each grouping 【发布时间】:2009-07-23 09:55:04 【问题描述】:

我正在使用 php/mysql 进行编码,并且有以下查询来获取产品和产品组数据:

SELECT products.id,products.name,product_groups.id,product_groups.name
FROM products
INNER JOIN product_groups
ON products.id=product_groups.id
WHERE products.name LIKE '%foobar%'
ORDER by product_groups.id ASC

因此,此查询获取产品并按产品组订购。我想要的是为每个产品分组只显示一次 product_groups.name 。所以即使我有十个鞋品,组名“鞋”也只显示一次。

我正在使用以下 PHP 来打印结果:

while ($data = mysql_fetch_array($result))

【问题讨论】:

【参考方案1】:

如果你想在 MySQL 查询中完成它,老实说,它的麻烦多于它的价值。一方面,在每个分组的顶部列出一个组名的语法真的很奇怪(我记得)。结果仍然被视为行,因此组名将被视为一行,所有其他列都为 Null,因此您不会真正在 PHP 脚本中节省任何时间或精力,因为它必须执行 if 语句捕获当它击中组名而不是组数据时。

如果您希望通过 PHP while 循环来完成,Johan 就在正确的轨道上。对于类似的情况,我使用以下内容:

$result = $sql->query($query);

$prev_group = "";

while($data = $result->fetch_assoc())
   $curr_group = $data['group'];
   if ($curr_group !== $prev_group) 
      echo "<h1>$curr_group</h1>";
      $prev_group = $curr_group;
    
    else 
        echo $data;
        .....
     

显然,回显数据将被设置为以您想要的方式回显数据的各个部分。但是 $prev_group/$curr_group 的设置是为了让它们唯一不匹配的时候是当您在一个新组中并因此想要打印某种标题时。

【讨论】:

是的......我的回应会呼应安东尼的【参考方案2】:
while($data = mysql_fetch_assoc($result))
    if($data['product_groups.name'] != $groupname)
        echo "Groupname: ".$data['product_groups.name']."<br />";
        $groupname = $data['product_groups.name'];
    
    echo "ID: ".$data['products.id']."<br />";
    echo "Name: ".$data['products.name']."<br />";

也许你可以这样做!?

【讨论】:

以上是关于MySQL:每个分组只打印一次数据的主要内容,如果未能解决你的问题,请参考以下文章

MySQL分组、排序

MySQL学习笔记16分组复制的几个常见问题以及解决办法

MySQL - 按一列分组并获得最低值

MySQL必知必会--分 组 数 据

MySQL:按连续天分组并计数组

MySQL group by后取每个分组中最新一条数据