【问题标题】:How to loop rows with PHP using GROUP_CONCAT MySQL如何使用 GROUP_CONCAT MySQL 使用 PHP 循环行
【发布时间】:2015-11-23 12:13:16
【问题描述】:

我正在尝试循环来自不同类别的产品,如下所示:

 $sql = query("SELECT c.name AS 'cat_name', c.image AS 'image', 
                GROUP_CONCAT(DISTINCT p.title ORDER BY p.title DESC SEPARATOR ' ') AS 'product_name' 
                FROM products p 
                INNER JOIN categories c 
                ON p.category_id = c.id 
                GROUP BY p.category_id");
  confirm($sql);

  while($category = mysqli_fetch_array($sql)) {
  $content = <<<DELIMITER


       <li class="col-md-3 col-sm-6">
                <ul>
                  <li class="dropdown-header">{$category['cat_name']}</li>
                  <li><a title="Title" href="#">{$category['product_name']}</a></li>                    

                </ul>
              </li>



 DELIMITER;

 echo $content;
 }

上面的脚本产生以下结果:

类别名称
产品 1 产品 2...

我希望列出这样的产品:

类别名称
产品1
产品2
...

我做错了什么?

【问题讨论】:

  • 嗯,所以不要使用 GROUP_CONCAT... GROUP BY

标签: php mysql


【解决方案1】:

函数GROUP_CONCAT 为您提供每个类别仅一行的响应。它会将所有具有相同类别的行连接到一个中。

你有两种可能:

  1. 使用 GROUP_CONCAT :每行将包含您的类别,并连接您的所有产品。然后您应该拆分“产品名称列表”的串联以正确显示它们。

  2. 不要使用 GROUP_CONCAT :您按类别名称对结果进行分组。在您的循环中,您检查类别名称何时更改,然后相应地更改您的 html。


编辑:

您的变量$category['product_name'] 包含由函数GROUP_CONCAT 使用分隔符space 连接的产品名称。 如果你写

echo $category['product_name']

它会打印出来

Product 1 Product 2...

您可以使用split()(已过时)或explode() 分隔产品名称。然后,您需要遍历数组 explode() 返回以获取每个产品。

但是如果您的产品名称中包含空格,使用GROUP_CONCAT 以空格作为分隔符并以空格作为分隔符进行拆分,您会得到太多的结果。我建议你使用另一个不能在产品名称中使用的分隔符。

【讨论】:

  • 您好,感谢您的回答。我不太明白第 1 点:那么您应该拆分“产品名称列表”的串联以正确显示它们。你到底是什么意思?
  • 您查询的字段product_name 将包含由空格连接的产品名称。如果你用连接字符分割你的字符串,你会得到一组元素。 (请注意,如果您在产品名称中使用空格,您将获得更多产品,因此您应该选择适当的连接字符,例如管道 | 或其他。
  • 是的,但是产品总是水平显示而不是垂直显示为列表。我不明白如何将它们循环为列表(垂直)
  • @Robert explode 会起作用。只需将 GROUP_CONCAT 的分隔符从 ' ' 更改为永远不会出现在产品名称中的东西(例如 ;?),然后在您的 while 循环中爆炸产品名称并遍历结果数组
【解决方案2】:

你可以改用这个:

SELECT DISTINCT c.name cat_name
              , c.image
              , p.title product_name
           FROM products p   
           JOIN categories c 
             ON p.category_id = c.id;

【讨论】:

  • 您好,感谢您的回答。不幸的是,您的建议显示了两倍的类别名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2015-05-05
  • 2016-03-14
  • 2021-10-10
  • 1970-01-01
相关资源
最近更新 更多