2012-04-11 134 views
0

我正在MySQL中使用GROUP_CONCAT生成一个字符串。什么是转换为数组的最佳字符串格式?

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

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

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

然后将此转换为在PHP阵列。

+0

只是一个mysql_fetch_array没有帮助你吗? – hjpotter92 2012-04-11 17:19:27

+1

写你的查询和表格结构,也许有比group_concat更好的方法 – safarov 2012-04-11 17:24:19

+0

@safarov没有没有更好的方法,标签将是一列,其余列将是问题的细节。 – 2012-04-11 17:27:02

回答

0

我不知道你为什么试图这样做。但此查询应该工作

SELECT * FROM `yourtable` GROUP_CONCAT(
    CONCAT('{"id":"',id,'","name":"',name,'"}') 
    separator ',') 
1

您的GROUP_CONCAT()是否产生JSON字符串?在这种情况下,json_decode($string, true)(在PHP docs上的json_decode())将会执行此操作。

但是,这样做不会比像上面提到的跳跃青蛙那样快。 mysql_fetch_array()会为您解析字符串(使用MYSQL_NUM以避免额外的开销),并且您还将避免MySQL在GROUP_CONCAT()上的额外时间;

如果你只是想在DB上存储一些JSON数据(这会使未来的搜索和索引复杂化,但有时候当你不想创建大量数据库字段时是一个不错的选择,Wordpress可以完成所有的时间),您可以在存储之前使用json_encode(),并且可以使用json_decode()为此目的检索原始数组/对象。你也可以使用PHP serialize()unserialize(),但我认为JSON更好,因为你提到你在哪里使用Javascript。

+0

在mysql查询中生成JSON是个愚蠢的错误。思考SQL注入,但用于JSON。最好从MySQL获取原始数据,然后在PHP中进行操作/编码。 – 2012-04-11 17:36:03

+0

我知道,但看起来男人没有别的选择! – Mauro 2012-04-11 17:45:57

+0

不需要做一个常规的'select id,name from ...'查询,然后将其构建到一个PHP数组中,然后json_encoding将会更加可靠。 – 2012-04-11 17:48:15

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); 

正如萨法罗夫指出,你需要知道的group_concat_max_len限制。

相关问题