我正在MySQL中使用GROUP_CONCAT生成一個字符串。什麼是轉換爲數組的最佳字符串格式?
我需要爲每一行選擇id和名稱,我應該如何格式化查詢中的字符串,以便我可以生成一個數組,以便以最佳速度連接PHP中的ID和名稱?
例如(我的嘗試): GROUP_CONCAT產生
{"id":1,"name":"python"},{"id":2,"name":"ruby"}
然後將此轉換爲在PHP陣列。
我正在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