2012-04-11 130 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限制。

相關問題