我刚刚发现了这个非常有用的MySQL函数GROUP_CONCAT
。它对我来说是如此有用且过于简化,以至于我实际上不敢使用它。主要是因为自从我开始进行网络编程以来已经有一段时间了,而且我从未在任何地方见过它。很棒的用法示例如下
Table会为clients
每个客户(唯一的ID)保留一行(您不说…)。
表currencies
有3列client_id
,currency
而amount
。
现在,如果我想name
从clients
表及其余额中获取用户15 ,使用数组覆盖的“旧”方法,则必须使用以下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列,那么编写该野兽将是一个很大的难题。
使用GROUP_CONCAT()通常会调用分组逻辑并创建临时表,这通常会对性能产生很大的负面影响。有时,您可以添加正确的索引以避免在group-by查询中使用临时表,但并非在每种情况下都可以。
正如@MarcB所指出的,组连接字符串的默认长度限制非常短,许多人被截断的列表弄糊涂了。您可以使用group_concat_max_len来增加限制。
在PHP中将字符串爆炸成数组不是免费的。仅仅因为您可以在PHP中的一个函数调用中做到这一点,并不意味着它是性能最佳的。我尚未对差异进行基准测试,但我怀疑您是否也有。
GROUP_CONCAT()是一种MySQLism。其他SQL产品未广泛支持它。在某些情况下(例如SQLite),它们具有GROUP_CONCAT()函数,但其功能与MySQL中的功能并不完全相同,因此,如果必须支持多个RDBMS后端,则可能导致令人困惑的错误。当然,如果您不必担心移植,这不是问题。
如果要从currencies
表中获取多个列,则需要多个GROUP_CONCAT()表达式。列表是否保证顺序相同?也就是说,一个列表中的第三个字段是否与下一个列表中的第三个字段相对应?答案是否定的-除非您ORDER BY
在GROUP_CONCAT()中使用子句指定顺序,否则不会。
我通常喜欢您的第一种代码格式,使用常规的结果集,然后遍历结果,保存到由客户ID索引的新数组中,然后将货币附加到数组中。这是一个简单的解决方案,使SQL保持简单且易于优化,如果要提取多个列,则效果更好。
我并不是要说GROUP_CONCAT()不好!在许多情况下,它确实很有用。但是,试图使任何一种“一刀切”的规则使用(或避免使用)任何功能或语言功能都是很简单的。
我有一个编辑文本和按钮。EditText用于用户名。我有一个问题,我的代码在下面。 我的问题是当用户点击按钮时没有放任何东西,toast消息显示;这很好,但当用户放入空间时,它将fullname值存储为空。我不想要空值。
通过网络传输敏感信息是有风险的,出于以下原因: 你不能总是确保与你交流的实体真的是你认为那位。 网络数据可以被截获,因此它是有可能被未经授权的第三方(有时被称为一个攻击者)所读取。 攻击者截获数据并可能修改它才将其发送给接收者。 SSL 解决了这些问题。它解决了第一个问题的方式是,有选择地允许通讯双方的身份来确保另一方在一个身份验证过程一旦双方认证通过,SSL 提供了一个双方消息安全传输的加密连接
这是我有生以来第一次发现自己正在编写一个开源的Java API。希望能被列入许多其他项目。 对于日志记录,我(以及与我一起工作的人)一直使用JUL(java.util.logging),从来没有遇到过任何问题。然而,现在我需要更详细地了解我应该为我的API开发做些什么。我对此做了一些研究,我得到的信息让我更加困惑。因此有了这篇文章。 因为我是从七月来的,所以我对此有偏见。我对其余的知识不是那么多。
本文向大家介绍为何官方推荐使用axios而不用vue-resource?相关面试题,主要包含被问及为何官方推荐使用axios而不用vue-resource?时的应答技巧和注意事项,需要的朋友参考一下 1.vue-resources不再更新了,vue作者尤大推荐axios。 2.axios更加强大 3.axios就是一个基于ES6的Promise的网络请求库,其实说干净了就是一个打包好的XMLHtt
问题内容: 我正在尝试获取下一个即将到来的星期五的日期,并将其格式设置为 yyyyMMDD。如果可能,我想不使用JodaTime来执行此操作。这是 我的代码: But when I run this I get the following error (running it today 20170809) 我究竟做错了什么? 编辑:我正在使用Java 8 问题答案: Big means . You
问题内容: 如果我们采用以下代码: 相对于,更喜欢多态是什么意思,顺便说一句,为什么更好呢? 编辑: 我了解什么是多态性;我所缺少的是人们将如何使用它而不是。 问题答案: if … else …(或switch或Visitor)之间以及多态之间的主要区别是模块化。有所谓的开闭原理,这基本上意味着,当您向现有程序中添加新功能时,对现有代码所做的更改越少越好(因为每次更改都需要一些工作,并且可能会引入