繁体   English   中英

如何将mySQL中具有相同值的行分组到php中?

[英]How can I group rows with the same value from mySQL into php?

这是我的mySQL表animals

    ╔══════════╦══════╗
    ║  animal  ║ name ║
    ╠══════════╬══════╣
    ║   dog    ║ sam  ║
    ║   cat    ║ fred ║
    ║   cat    ║ todd ║
    ║  bird    ║ alan ║
    ╚══════════╩══════╝

我想在表格中选择所有数据:

            $sql = 'SELECT  *  FROM animals';
            foreach ($pdo->query($sql) as $row) {
                echo '<td>'.$row['animal'].' </td>';
                echo '<td>'.$row['name'].' </td>';
            }

我的结果是:

    ╔══════════╦══════╗
    ║   dog    ║ sam  ║
    ║   cat    ║ fred ║
    ║   cat    ║ todd ║
    ║  bird    ║ alan ║
    ╚══════════╩══════╝

但我想只用同一个动物输出一次行,但是所有的名字都在一行中,如下所示:

    ╔══════════╦═════════════╗
    ║   dog    ║ sam         ║
    ║   cat    ║ fred, todd  ║
    ║  bird    ║ alan        ║
    ╚══════════╩═════════════╝

我不知道如何实现这一目标。 我试着朝这个方向思考:

SELECT  *  FROM animals GROUP BY animal

但我被卡住了! 我很高兴每一个提示!

SELECT  
  a.animal
  GROUP_CONCAT(a.name) names
FROM animals a
GROUP BY a.animal

注意检查我更改的查询并将您的php片段$row['name']更改$row['names']

更新将您的循环更改为:

        foreach ($pdo->query($sql) as $row) {
            echo '<tr><td>'.$row['animal'].' </td>';
            echo '<td>'.$row['names'].' </td></tr>';
        }

MySQL有一个非标准的SQL函数,名为GROUP_CONCAT专门用于执行此操作。

用于:

SELECT  animal, GROUP_CONCAT(name) as grouped_name  FROM animals GROUP BY animal

在PHP中使用:

 $sql = ' SELECT  animal, GROUP_CONCAT(name) as grouped_name  FROM animals GROUP BY animal';
 foreach ($pdo->query($sql) as $row) {
     echo '<td>'.$row['animal'].' </td>';
     echo '<td>'.$row['grouped_name'].' </td>'; 
 }

请注意如何将具有组的列重命名/别名为grouped_name这是因为该列不再是name列。 您可以在sql结果中通过别名grouped_name来引用此列。

您可以使用GROUP BYGROUP_CONCAT来实现它

GROUP BY与聚合函数结合使用,将结果分组为一列或多列。

GROUP_CONCAT是一个聚合函数,用于连接正在分组的列。


因此,在您的情况下,您应该GROUP BY animal列并在同一个上应用GROUP_CONCAT 像这样:

SELECT  
  A.animal
  GROUP_CONCAT(A.name)
FROM animals A
GROUP BY A.animal

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM