0

我在 MySQL 中使用 GROUP_CONCAT 生成一个字符串。

我需要为每一行选择 2 列作为 id 和 name,我应该如何格式化查询中的字符串,以便我可以生成一个以最佳速度耦合 PHP 中的 id 和名称的数组?

例如(我的尝试): GROUP_CONCAT 生产

{"id":1,"name":"python"},{"id":2,"name":"ruby"}

然后将其转换为 PHP 中的数组。

4

3 回答 3

1

您是否正在GROUP_CONCAT()生成 JSON 字符串?在这种情况下, ( PHP 文档json_decode($string, true)上的 json_decode() )会做这件事。

但这不会比上面建议的跳跃青蛙更快。mysql_fetch_array()将为您解析字符串(用于MYSQL_NUM避免额外开销),您还将避免 MySQL 在GROUP_CONCAT();上的额外时间

如果您只想在数据库中存储一些 JSON 数据(这会使将来的搜索和索引变得复杂,但有时当您不想创建大量数据库字段时这是一个不错的选择,Wordpress 一直都在这样做),您可以json_encode()在存储之前使用并json_decode()为此检索原始数组/对象。你也可以使用 PHPserialize()unserialize(),但我认为 JSON 更可取,因为你提到你在哪里使用 Javascript。

于 2012-04-11T17:30:47.633 回答
1

像这样的东西-

<?php

$db = new PDO('mysql:dbname=test;host=127.0.0.1', 'user', 'pass');
$stmt = $db->prepare("SELECT some_field, GROUP_CONCAT(CONCAT_WS('::', id, name) SEPARATOR '||') AS grp
                      FROM `table`
                      GROUP BY some_field");
$stmt->execute();

while($row = $stmt->fetchObject()) {
    foreach(explode('||', $row->grp) as $pair) {
        $tmp = explode('::', $pair);
        $array[$row->some_field][$tmp[0]] = $tmp[1];
    }
}
print_r($array);

正如 safarov 所指出的,您需要注意 group_concat_max_len 限制。

于 2012-04-11T17:43:44.250 回答
0

我不知道你为什么要这样做。但是这个查询应该有效

SELECT * FROM `yourtable` GROUP_CONCAT(
    CONCAT('{"id":"',id,'","name":"',name,'"}') 
    separator ',')
于 2012-04-11T17:36:01.000 回答