我刚刚发现了这个非常有用的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