不使用 GROUP_CONCAT 的原因?

2023-12-06

我刚刚发现了这个非常有用的 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 列,那么编写这个野兽真的是一个很大的痛苦。


  • 使用 GROUP_CONCAT() 通常会调用分组逻辑并创建临时表,这通常会对性能产生很大的负面影响。有时您可以添加正确的索引来避免在分组查询中使用临时表,但并非在所有情况下都如此。

  • 正如 @MarcB 指出的,组连接字符串的默认长度限制非常短,许多人都对截断的列表感到困惑。您可以增加限制组连接最大长度.

  • 在 PHP 中将字符串分解为数组并不是免费的。仅仅因为您可以在 PHP 中的一个函数调用中完成此操作,并不意味着它是最好的性能。我没有对差异进行基准测试,但我怀疑你也有。

  • GROUP_CONCAT() 是一种 MySQLism。其他 SQL 产品并未广泛支持它。在某些情况下(例如 SQLite),它们有一个 GROUP_CONCAT() 函数,但它的工作方式与 MySQL 中的工作方式并不完全相同,因此如果您必须支持多个 RDBMS 后端,这可能会导致令人困惑的错误。当然,如果你不需要担心移植,这不是问题。

  • 如果您想从您的数据中获取多列currencies表,那么您需要多个 GROUP_CONCAT() 表达式。列表的顺序是否保证相同?也就是说,一个列表中的第三个字段是否对应于下一个列表中的第三个字段?答案是否定的——除非您用ORDER BYGROUP_CONCAT() 内的子句。

我通常喜欢你的第一种代码格式,使用传统的结果集,并循环结果,保存到由客户端 id 索引的新数组,将货币附加到数组。这是一个简单的解决方案,使 SQL 保持简单且更易于优化,并且如果您有多个列要获取,效果会更好。

我并不是想说 GROUP_CONCAT() 不好!在很多情况下它确实很有用。但试图制定任何一刀切的规则来使用(或避免)任何函数或语言功能是过于简单化的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不使用 GROUP_CONCAT 的原因? 的相关文章

  • 执行mvn sql:execute时出错

    我希望 Maven 执行该 sql 文件 它生成的数据库模式稍后将在我的程序中使用 但它不起作用 可能是由 DELIMITER 引起的 当我执行 mvn sql execute 时 它会打印出 ERROR Failed to execute
  • 使用 libpqxx 批量存储数据或如何在 libpqxx 中使用 COPY 语句

    要在 PostgreSQL 中插入批量数据 填充数据库 最快的方法是使用 COPY Source https stackoverflow com questions 758945 whats the fastest way to do a
  • MySQL 中的 INSERT 和 UPDATE 有什么区别?

    它似乎INSERT and UPDATE对我做同样的事情 有什么场合我应该使用INSERT代替UPDATE反之亦然 In 增删改查操作 http en wikipedia org wiki Create read update and de
  • S3 上上传文件的 MIME 类型

    如何更改 Amazon S3 上上传文件的 MIME 类型 我尝试过http docs amazonwebservices com AWSSDKforPHP latest m Amazon S3 更改内容类型 http docs amazo
  • Preg在html标签之间匹配php中的文本

    您好 我想在 PHP 中使用 preg match 从 html 文档中解析出以下内容中的 所需文本 p class review Desired text p 通常我会使用 simple html dom 来做这样的事情 但在这种情况下它
  • 在sql server中生成下一个序列号

    我需要生成一个序列号用作主键 在遗留系统中 我想知道以下解决方案在竞争条件下是否会遇到并发问题 CREATE TABLE SequenceGenerator Sequence INT INSERT INTO SequenceGenerato
  • SQLAlchemy:检查给定值是否在列表中

    问题 在 PostgreSQL 中 检查某个字段是否在给定列表中是使用IN操作员 SELECT FROM stars WHERE star type IN Nova Planet SQLAlchemy 的等价物是什么INSQL查询 我尝试过
  • 使用 MySQL 计算时间线中的变化

    我是 MySQL 新手 我需要你的帮助 我有一个包含类似数据的表 RobotPosX RobotPosY RobotPosDir RobotShortestPath 0 1 0 2 15 1456 0 2 0 3 30 1456 0 54
  • PHP、in_array 和数组中的快速搜索(到最后)

    我对在数组中进行快速搜索的更好方法有疑问 我正在谈论一个特定的情况 假设我有一个数组 L A B C 当我开始时 当程序运行时 L 可能会增长 但到最后 当我进行搜索时 一个可能的原因是 L A B C D E 事实是 当我搜索时 我想要找
  • JPA:如何将字符串持久保存到数据库字段中,输入 MYSQL Text

    需求是用户可以写文章 所以我选择typeText为了contentmysql数据库内的字段 我怎样才能转换Java String into MySQL Text 干得好Jim Tough Entity public class Articl
  • 将延期交货库存状态添加到 Woocommerce 可变产品下拉列表中

    我想在下拉菜单中显示可变产品的库存状态 包括 缺货 因为我网站上的大多数产品都缺货 而不是 缺货 我已经尝试过答案如何将变体库存状态添加到 Woocommerce 产品变体下拉列表中 https stackoverflow com ques
  • 当我在 MySQL 中使用 UUID 作为主键时,会如何影响性能

    我想知道当我在 MySQL 中使用 UUID 作为主键时 会对服务器的性能产生怎样或多大的影响 我想你正在使用InnoDB 无论如何你应该 因此 请阅读 高性能 MySQL 2ed 第 117 页中的以下章节 一般来说 从性能的角度来看 U
  • 使用 impala 按范围连接表的有效方法

    我第一个有下表 Range 包括值范围和附加列 row From To Country 1 1200 1500 2 2200 2700 3 1700 1900 4 2100 2150 The From and Toare bigint并且是
  • 在 MySQL 连接字符串中指定密码

    我使用 MySQL 作为 DB 和 Yeoman 生成器创建了 ExpressJS MVC 应用程序 并在config js我想更改 MySQL 连接字符串 但我不知道在字符串中指定密码 我的字符串是mysql root localhost
  • T-SQL参数嗅探重新编译计划

    我有 SQL 命令 exec sp executesql N SELECT TOP 10 FROM mytableView WHERE Name LIKE Value0 ORDER BY Id DESC N Value0 varchar 5
  • 在 PHP 上发送不带 SMTP 标头的 SMS

    我正在尝试使用以下对我有用的代码通过 PHP 发送短信验证码 但我越来越 email protected cdn cgi l email protecti
  • SQL71501 - 如何消除此错误?

    我们在项目中使用两种模式 dbo kal 当我们尝试使用以下 SQL 语句创建视图时 Visual Studio 在错误列表中显示为错误 CREATE VIEW dbo RechenketteFuerAbkommenOderLieferan
  • APC 将数据存储在哪里?

    我想用apc store 缓存一些结果 但我需要知道数据将存储在哪里 以及限制是什么 它总是存储在内存中吗 或者也写入磁盘 我希望将不经常访问的数据存储在磁盘上 我应该为此使用不同的缓存系统吗 这就是极限了吗 apc shm size 32
  • Laravel 中间件将变量返回给控制器

    我正在对用户进行权限检查 以确定他们是否可以查看页面 这涉及首先通过一些中间件传递请求 我遇到的问题是 在将数据返回到视图本身之前 我在中间件和控制器中复制相同的数据库查询 这是设置的示例 路线 php Route get pages id
  • cUrl 在本地主机上工作正常,但在服务器上不起作用,仅显示空白页面

    当我在服务器上运行以下代码时 它只显示空白页面并突然停止进一步执行 我还检查了已安装的服务器上的 cUrl 这是我的代码 ftp server ftps server Voorraadtonen link csv ch curl init

随机推荐

  • 当图像接近边缘时,9 块阴影消失

    我正在使用 9 patch 为盒子生成阴影 如果图像宽度为 280dp 距框边缘 20dp 我会得到很好的阴影 315 度 但是 如果我让图像接触框边缘 右边缘的阴影几乎消失 这是我的布局
  • 需要根据 T-SQL 中准入日期列计算出的第一个“3 个月”,为列中的每个值添加 3 个月

    我有 14K 记录表 如下所示 与一个特定 client id 1002 相关的数据示例 我的日期格式是 mm dd yyyy 月份在前 ClientsEpisodes client id adm date disch date 1002
  • Android Fragment 生命周期问题(onActivityResult 上的 NullPointerException)

    我遇到一个问题 我找不到任何解释 我有一个使用 TabManager 显示片段的 FragmentActivity 如下所示 public class WorkOrderFormTabFragmentActivity extends Fra
  • django 更改默认运行服务器端口

    我想设置默认端口manage py runserver侦听无关的指定内容config ini 有没有比解析更简单的修复方法sys argv inside manage py并插入配置的端口 目标是跑 manage py runserver不
  • Wamp 服务器:更改 apache 的 httpd.conf?

    我正在尝试解决我的错误 我无法从服务器连接到我的 Android 应用程序 所有来源都将我引向以下教程作为解决方案 我已成功完成本教程中的所有步骤 除了 编辑Wamp服务器的httpd conf文件 IE 该教程说明了以下内容 4 在htt
  • 如何杀死 goroutine? [复制]

    这个问题在这里已经有答案了 我想知道如何杀死 停止 goroutine 所有示例都基于通道和选择 这似乎只有在 goroutine 包含一些可以在通道上监听的重复任务时才有效 有没有办法在下面的 goroutine 返回之前停止它 pack
  • 使用认知登录而不是证书来验证和订阅 aws IoT MQTT 主题?

    我是 AWS 的新手 我正在尝试弄清楚我的用例是否可行 我想创建一个移动应用程序 用户可以登录 电子邮件 facebook google 等 然后订阅 aws IoT 上的一些 MQTT 主题 以接收园艺系统的实时传感器数据 AWS 上有很
  • 使用循环提取一系列整数

    我有一些数据想要提取整数出现的频率 这是一些示例数据 df lt read table header T text A B C D 1 1 5 3 1 2 1 2 3 2 3 2 3 5 3 4 1 4 5 3 5 3 1 4 2 6 5
  • PostgreSQL 逻辑复制在 CREATE SUBSCRIPTION 上挂起

    我在 PostgreSQL 逻辑复制版本 15 上遇到问题 我也在 v10 和 v12 上进行了测试 但遇到了同样的问题 它需要复制来进行测试 因此源数据库和目标数据库位于同一服务器上 在我设置的配置文件中 postgresql conf
  • 在两个用户控件和主窗体之间传递对象

    因此 我有一个用作导航栏的主窗体和两个显示一些控件的用户控件 In UserControlsA我有一些字段需要填写 使用这些数据 我创建了一个包含一些信息的对象 我需要将该对象传递给UserControlsB所以我可以在那里显示一些数据 我
  • 正则表达式是测试 url 的好方法吗

    我正在尝试测试使用 php5 输入的 url 的有效性 我想过使用正则表达式 但假设它始终正常工作 它只能解决 url 在语法上有效的问题 它没有告诉我有关网址正确或有效的任何信息 如果可能的话 我正在尝试寻找另一种解决方案来同时完成这两件
  • 带参数改造post请求

    我正在使用邮递员扩展来发送请求 我想对 android 提出同样的请求 我使用改造库来实现我的目标 但我无法获得成功的结果 我的代码错误在哪里 Postman 我的界面 public interface Interfacem FormUrl
  • 项目控件将其自身从容器控件中删除

    有一个容器控件 TScrollBox 它是多个项目控件的父控件 每个项目控件本身都是复合的 包含 父级和拥有 一个删除按钮 按下该按钮将启动项目控件的删除 删除涉及释放组件 因此实际操作应该与该项目无关 问题是 最好的方法是什么 我实际上知
  • OCaml 与非常量的模式匹配

    是否可以对变量而不是常量值进行模式匹配 let x 2 in let y 5 in match 2 with x gt foo y gt bar gt baz let y 5 in Warning 26 unused variable y
  • 如何在导出xml中添加DOCTYPE?

    我使用 PHP 导出了一个 xml 文件 xmldoc new DOMDocument xmldoc gt formatOutput true xmldoc gt encoding Shift JIS create root nodes r
  • 与Subject在组件之间共享数据

    我正在尝试在 Angular 6 中的两个组件之间与主题共享数据 不知怎的 它不起作用 我不知道为什么 我需要通过单击将数据从compare component 传递到profile component 当我点击时 数据没有传递 但不知怎的
  • EOFError:读取一行时出现EOF

    我正在尝试定义一个函数来制作矩形的周长 这是代码 width input height input def rectanglePerimeter width height return width height 2 print rectan
  • 如何用java在现有PDF中添加空白页? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我有普通的 PDF 文件 我想使用在 PDF 末尾插入空白页itext LIBRARY
  • 如何使用 HTML/JavaScript 捕获客户端“桌面”部分的屏幕截图?

    我知道如何捕获网页 但我想问如何捕获桌面或桌面中的其他应用程序 如果有办法突出显示屏幕的某些部分 就像 html2canvas 对网页所做的那样 我们可以使用 HTML JS 中的浏览器应用程序为桌面应用程序做一些事情吗 对的 这是可能的
  • 不使用 GROUP_CONCAT 的原因?

    我刚刚发现了这个非常有用的 MySQL 函数GROUP CONCAT 它对我来说似乎非常有用并且过于简单化 以至于我实际上害怕使用它 主要是因为我开始网络编程已经有一段时间了 而且我从未在任何地方见过它 一个很棒的用法示例如下 Table