我在MySQL中用GROUP_CONCAT生成一个字符串。
我需要为id和name的每一行选择两列,我应该如何格式化查询中的字符串,以便在PHP中以最佳速度生成一个耦合id和name的数组?
例如(我的尝试):GROUP_CONCAT producing
{"id":1,"name":"python"},{"id":2,"name":"ruby"}然后将其转换为PHP中的数组。
发布于 2012-04-12 01:36:01
我不知道你为什么要这么做。但是这个查询应该是有效的
SELECT * FROM `yourtable` GROUP_CONCAT(
CONCAT('{"id":"',id,'","name":"',name,'"}')
separator ',')发布于 2012-04-12 01:30:48
您的GROUP_CONCAT()是否生成了JSON字符串?在这种情况下,json_decode($string, true) (PHP docs上的json_decode())将执行此操作。
但这不会比上面的跳蛙建议的速度更快。mysql_fetch_array()将为您解析字符串(使用MYSQL_NUM以避免额外的开销),您还将避免MySQL在GROUP_CONCAT()上的额外时间;
如果您只想在数据库中存储一些JSON数据(这将使将来的搜索和索引变得复杂,但有时当您不想创建大量的DB字段时,这是一个很好的选择,Wordpress一直都是这样做的),您可以在存储之前使用json_encode()和json_decode()来检索原始数组/对象。您也可以使用PHP和unserialize(),但我认为JSON更可取,因为您提到了在哪里使用serialize()。
发布于 2012-04-12 01:43:44
像这样的东西-
<?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的限制。
https://stackoverflow.com/questions/10110786
复制相似问题