这是我的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
但我被卡住了!我很满意每一个提示!
答案 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 BY和GROUP_CONCAT来实现它。
GROUP BY 与聚合函数结合使用,可以按一列或多列对结果进行分组。
GROUP_CONCAT 是一个聚合函数,用于连接正在分组的列。
因此,在您的情况下,您应该 GROUP BY animal
列并在同一个地方应用 GROUP_CONCAT 。像这样:
SELECT
A.animal
GROUP_CONCAT(A.name)
FROM animals A
GROUP BY A.animal