什么是转换为数组的最佳字符串格式?
我正在MySQL中使用GROUP_CONCAT生成一个字符串。什么是转换为数组的最佳字符串格式?
我需要为每一行选择id和名称,我应该如何格式化查询中的字符串,以便我可以生成一个数组,以便以最佳速度连接PHP中的ID和名称?
例如(我的尝试): GROUP_CONCAT产生
{"id":1,"name":"python"},{"id":2,"name":"ruby"}
然后将此转换为在PHP阵列。
我不知道你为什么试图这样做。但此查询应该工作
SELECT * FROM `yourtable` GROUP_CONCAT(
CONCAT('{"id":"',id,'","name":"',name,'"}')
separator ',')
您的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。
在mysql查询中生成JSON是个愚蠢的错误。思考SQL注入,但用于JSON。最好从MySQL获取原始数据,然后在PHP中进行操作/编码。 – 2012-04-11 17:36:03
我知道,但看起来男人没有别的选择! – Mauro 2012-04-11 17:45:57
不需要做一个常规的'select id,name from ...'查询,然后将其构建到一个PHP数组中,然后json_encoding将会更加可靠。 – 2012-04-11 17:48:15
事情是这样的 -
<?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限制。
只是一个mysql_fetch_array没有帮助你吗? – hjpotter92 2012-04-11 17:19:27
写你的查询和表格结构,也许有比group_concat更好的方法 – safarov 2012-04-11 17:24:19
@safarov没有没有更好的方法,标签将是一列,其余列将是问题的细节。 – 2012-04-11 17:27:02