我在 MySQL 中使用 GROUP_CONCAT 生成一个字符串。
我需要为每一行选择 2 列作为 id 和 name,我应该如何格式化查询中的字符串,以便我可以生成一个以最佳速度耦合 PHP 中的 id 和名称的数组?
例如(我的尝试): GROUP_CONCAT 生产
{"id":1,"name":"python"},{"id":2,"name":"ruby"}
然后将其转换为 PHP 中的数组。
您是否正在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。
像这样的东西-
<?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 限制。
我不知道你为什么要这样做。但是这个查询应该有效
SELECT * FROM `yourtable` GROUP_CONCAT(
CONCAT('{"id":"',id,'","name":"',name,'"}')
separator ',')