我刚刚发现了这个非常有用的 MySQL 函数GROUP_CONCAT
。它对我来说似乎非常有用并且过于简单化,以至于我实际上害怕使用它。主要是因为我开始网络编程已经有一段时间了,而且我从未在任何地方见过它。一个很棒的用法示例如下
Table clients
每个客户端保存一行具有唯一 ID 的客户端(你不会说...)。
Table currencies
有 3 列client_id
, currency
and amount
.
现在如果我想获得用户 15name
来自clients
表及其余额,使用数组覆盖的“旧”方法我必须使用以下 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']));
}
我想问的问题是,在性能或任何其他方面使用此功能是否有任何缺点,因为对我来说,它看起来简直太棒了,这让我认为人们一定有理由不使用它经常。
EDIT:
最终,我想问,除了数组覆盖之外,还有哪些其他选项可以从 MySQL 结果集中得到一个多维数组,因为如果我选择 15 列,那么编写这个野兽真的是一个很大的痛苦。