我在MySQL中使用GROUP_CONCAT生成一个字符串。
我需要为每一行选择2列作为id和name,我应该如何格式化查询中的字符串,以便生成一个以最佳速度耦合PHP中的id和名称的数组?
例如(我的尝试): GROUP_CONCAT生成
{"id":1,"name":"python"},{"id":2,"name":"ruby"}
然后将其转换为PHP中的数组。
答案 0 :(得分:1)
您的GROUP_CONCAT()
生成JSON字符串吗?在这种情况下,json_decode($string, true)
(PHP docs上的json_decode())会做这件事。
但这并不比上面提到的跳蛙更快。 mysql_fetch_array()
将为您解析字符串(使用MYSQL_NUM
以避免额外开销)并且您还将避免GROUP_CONCAT()
上的MySQL额外时间;
如果你只是想在数据库上存储一些JSON数据(这会使未来的搜索和索引变得复杂,但有时当你不想创建大量的数据库字段时,这是一个很好的选择,Wordpress会一直这样做),您可以在存储之前使用json_encode()
并使用json_decode()
来检索原始数组/对象。您也可以使用PHP serialize()
和unserialize()
,但我认为JSON更受欢迎,因为您提到了使用Javascript的地方。
答案 1 :(得分: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限制。
答案 2 :(得分:0)
我不知道你为什么要这样做。但是这个查询应该可以正常工作
SELECT * FROM `yourtable` GROUP_CONCAT(
CONCAT('{"id":"',id,'","name":"',name,'"}')
separator ',')