Php 按字段分组行
我有以下表格结构:Php 按字段分组行,php,mysql,sql,Php,Mysql,Sql,我有以下表格结构: +------------------------+ | id | name | category | +------------------------+ | 1 | name_1 | cat_1 | | 2 | name_2 | cat_2 | | 3 | name_3 | cat_1 | | . | . | . | | . | . | . | | n | name_n | cat_k
+------------------------+
| id | name | category |
+------------------------+
| 1 | name_1 | cat_1 |
| 2 | name_2 | cat_2 |
| 3 | name_3 | cat_1 |
| . | . | . |
| . | . | . |
| n | name_n | cat_k |
+------------------------+
WARE“n”是表的总行数,“k”是任意数。我的问题是,有没有办法进行SQL查询来检索按类别分组的行?我的意思是有可能得到这样的结构
array(
"cat_1" => array(
"name_1", "1",
"name_3", "3",
),
"cat_2" => array(
"name_2", "2",
some rows ....
),
...
"cat_k" => array(
some rows....
),
)
如果有任何方法,请给我一些关键字,而不是整个解决方案。你不能在一个查询中真正做到这一点,因为仅mysql无法生成多维数组,但使用PHP几乎是微不足道的。基本上,以下是您要做的:
$cats = array();
while ($row = $result->fetch()) {
if (!isset($cats[$row->category])) {
$cats[$row->category] = array();
}
$cats[$row->category][] = $row->name;
}
查询本身不会提供这种结构,但将结果集读入这种二维数组非常容易:
$query = "SELECT category, id, name FROM table ORDER BY category ASC, id ASC";
$result = /* use you DB query mechanism of choice here */;
$array = array();
while($row = /* use your DB row fetch mechanism of choice here */) {
$array[$row['category']][] = array($row['id'] => $row['name']);
}
使用GROUP_CONCAT然后分解结果的每个元素怎么样?哪一个更有效?@papelucho这将要求您对id和name字段执行GROUP_CONCAT,因此您将有两个字段进行分解和填充。另一方面,结果集中要迭代的行会更少。我不能说哪一个操作效率更高(你可以测试这个),但是我可以说,使用GROUP_CONCAT进行这项操作是非常非常规的。如果需要跨联接获取数据(例如,可能是来自另一个表的类别描述字段),我建议的方法也会更容易使用。