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

时间:2016-06-21 12:44:14

标签: php mysql

这是我的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

但我被卡住了!我很满意每一个提示!

3 个答案:

答案 0 :(得分:7)

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>';
        }

答案 1 :(得分:6)

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

用作:

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来引用此列。

答案 2 :(得分:3)

您可以使用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