我剛剛發現了這個非常有用的MySQL函數GROUP_CONCAT
。它對我來說似乎非常有用和過分簡化,我實際上不敢使用它。主要是因爲我開始使用網絡編程已經有相當長的一段時間了,我從來沒有見過它。一個真棒使用示例將如下不使用GROUP_CONCAT的原因?
表clients
持有客戶端(你不會說...)每個客戶端一行具有唯一的ID。
表currencies
有3列client_id
,currency
和amount
。
現在,如果我想獲得從clients
表用戶15的name
和他的平衡,以陣列的「老」方法會覆蓋我會做使用下面的SQL
SELECT id, name, currency, amount
FROM clients LEFT JOIN currencies ON clients.id = client_id
WHERE clients.id = 15
然後在PHP我不得不遍歷結果集,做一個陣列覆蓋(我真的不是一個大風扇,特別是在大量的結果集)像
$result = array();
foreach($stmt->fetchAll() as $row){
$result[$row['id']]['name'] = $row['name'];
$result[$row['id']]['currencies'][$row['currency']] = $row['amount'];
}
然而新發現的功能,我可以用這個
SELECT id, name, GROUP_CONCAT(currency) as currencies GROUP_CONCAT(amount) as amounts
FROM clients LEFT JOIN currencies ON clients.id = client_id
WHERE clients.id = 15
GROUP BY clients.id
然後在應用層面的東西是如此真棒,漂亮
$results = $stmt->fetchAll();
foreach($results as $k => $v){
$results[$k]['currencies'] = array_combine(explode(',', $v['currencies']), explode(',', $v['amounts']));
}
這個問題我想請教的是有沒有什麼缺點使用性能或任何這種功能在所有的,因爲對我來說只是看起來像純粹的迷人,這讓我認爲,人們不應該經常使用它的理由是一定的。
編輯:
我要問,最終,有什麼其他的選擇,除了陣列覆蓋從一個MySQL結果集多維數組中結束了,因爲如果我選擇15列這是一個真正的大痛苦在脖子上寫那個野獸......
它很方便,但它並不普遍。它可以返回的字符串的長度有限,默認情況下通常爲1024個字符。如果你有一個'大'數據集,你的連接字符串可以很容易超過1024個字符,它會被無聲地截斷/損壞。 – 2014-10-06 21:22:05
這是所有覆蓋在這裏http://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field/276949#276949 – 2014-10-06 21:23:09
該長度可以配置 – 2014-10-06 21:23:14