Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按字段分组行_Php_Mysql_Sql - Fatal编程技术网

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进行这项操作是非常非常规的。如果需要跨联接获取数据(例如,可能是来自另一个表的类别描述字段),我建议的方法也会更容易使用。