Mysql group_concat 重复键和1次查询中多列重复次数(查询优化)

2023-11-21

这个问题是关于查询优化以避免通过 PHP 多次调用数据库。

所以这是场景,我有两个表,一个包含您可以将其称为参考表的信息,另一个是数据表、字段key1 and key2这两个表都是通用的,根据这些字段,我们可以将它们连接起来。

我不知道查询是否可以比我现在正在做的更简单,我想要实现的目标如下:

我想找到独特的key1,key2,info1,info2 from main_info表,只要序列值小于 10 并且key1,key2两者的 表匹配,然后将它们分组info1,info2, 分组时 统计重复次数key1,key2对于重复项info1,info2领域 和group_concat那些钥匙

表的内容main_info

MariaDB [demos]> select * from main_info;
+------+------+-------+-------+----------+
| key1 | key2 | info1 | info2 | date     |
+------+------+-------+-------+----------+
|    1 |    1 |    15 |    90 | 20120501 |
|    1 |    2 |    14 |    92 | 20120601 |
|    1 |    3 |    15 |    82 | 20120801 |
|    1 |    4 |    15 |    82 | 20120801 |
|    1 |    5 |    15 |    82 | 20120802 |
|    2 |    1 |    17 |    90 | 20130302 |
|    2 |    2 |    17 |    90 | 20130302 |
|    2 |    3 |    17 |    90 | 20130302 |
|    2 |    4 |    16 |    88 | 20130601 |
+------+------+-------+-------+----------+
9 rows in set (0.00 sec) 

表的内容product1

MariaDB [demos]> select * from product1;
+------+------+--------+--------------+
| key1 | key2 | serial | product_data |
+------+------+--------+--------------+
|    1 |    1 |      0 | NaN          |
|    1 |    1 |      1 | NaN          |
|    1 |    1 |      2 | NaN          |
|    1 |    1 |      3 | NaN          |
|    1 |    2 |      0 | 12.556       |
|    1 |    2 |      1 | 13.335       |
|    1 |    3 |      1 | NaN          |
|    1 |    3 |      2 | 13.556       |
|    1 |    3 |      3 | 14.556       |
|    1 |    4 |      3 | NaN          |
|    1 |    5 |      3 | NaN          |
|    2 |    1 |      0 | 12.556       |
|    2 |    1 |      1 | 13.553       |
|    2 |    1 |      2 | NaN          |
|    2 |    2 |     12 | 129          |
|    2 |    3 |     22 | NaN          |
+------+------+--------+--------------+
16 rows in set (0.00 sec)

通过 PHP 我对字段进行分组info1 and info2表的main_info,在当前上下文中serial,product_data表的product1,接连多次(如您所见,这里我运行查询两次)

对于领域serial- 第一个查询

MariaDB [demos]> select * , count(*) as serial_count,GROUP_CONCAT(key1,' ',key2) as serial_ids from 
    -> (
    -> SELECT distinct 
    -> if(b.serial  < 10,a.key1,null) AS `key1`,
    -> if(b.serial  < 10,a.key2,null) AS `key2`,
    -> if(b.serial  < 10,a.info1,null) AS `info1`, 
    ->         if(b.serial  < 10,a.info2,null) AS `info2`
    -> FROM main_info a inner join product1 b on  a.key1 = b.key1 AND a.key2= b.key2
    -> ) as sub group by info1,info2
    -> ;
+------+------+-------+-------+--------------+-------------+
| key1 | key2 | info1 | info2 | serial_count | serial_ids  |
+------+------+-------+-------+--------------+-------------+
| NULL | NULL |  NULL |  NULL |            1 | NULL        |
|    1 |    2 |    14 |    92 |            1 | 1 2         |
|    1 |    3 |    15 |    82 |            3 | 1 3,1 4,1 5 |
|    1 |    1 |    15 |    90 |            1 | 1 1         |
|    2 |    1 |    17 |    90 |            1 | 2 1         |
+------+------+-------+-------+--------------+-------------+
5 rows in set (0.00 sec)

对于领域product_data- 第二次查询

MariaDB [demos]> select * , count(*) as product_data_count,GROUP_CONCAT(key1,' ',key2) as product_data_ids from 
    -> (
    -> SELECT distinct 
    -> if(b.product_data IS NOT NULL,a.key1,null) AS `key1`,
    -> if(b.product_data IS NOT NULL,a.key2,null) AS `key2`,
    -> if(b.product_data IS NOT NULL,a.info1,null) AS `info1`, 
    ->         if(b.product_data IS NOT NULL,a.info2,null) AS `info2`
    -> FROM main_info a inner join product1 b on  a.key1 = b.key1 AND a.key2= b.key2
    -> ) as sub group by info1,info2
    -> ;
+------+------+-------+-------+--------------------+------------------+
| key1 | key2 | info1 | info2 | product_data_count | product_data_ids |
+------+------+-------+-------+--------------------+------------------+
|    1 |    2 |    14 |    92 |                  1 | 1 2              |
|    1 |    3 |    15 |    82 |                  3 | 1 3,1 4,1 5      |
|    1 |    1 |    15 |    90 |                  1 | 1 1              |
|    2 |    2 |    17 |    90 |                  3 | 2 2,2 3,2 1      |
+------+------+-------+-------+--------------------+------------------+
4 rows in set (0.01 sec)

我想使用一个查询(按 info1、info2 分组)获得这样的输出

+------+------+-------+-------+--------------+-------------+--------------------+------------------+
| key1 | key2 | info1 | info2 | serial_count | serial_ids  | product_data_count | product_data_ids |
+------+------+-------+-------+--------------+-------------+--------------------+------------------+
| NULL | NULL |  NULL |  NULL |            1 | NULL        |               NULL | NULL             |
|    1 |    2 |    14 |    92 |            1 | 1 2         |                  1 | 1 2              |
|    1 |    3 |    15 |    82 |            3 | 1 3,1 4,1 5 |                  3 | 1 3,1 4,1 5      |
|    1 |    1 |    15 |    90 |            1 | 1 1         |                  1 | 1 1              |
|    2 |    1 |    17 |    90 |            1 | 2 1         |                  3 | 2 2,2 3,2 1      |
+------+------+-------+-------+--------------+-------------+--------------------+------------------+

下面是表的结构

DROP TABLE IF EXISTS `main_info`;
CREATE TABLE `main_info` (
  `key1` int(11) NOT NULL,
  `key2` int(11) NOT NULL,
  `info1` int(11) NOT NULL,
  `info2` int(11) NOT NULL,
  `date` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


LOCK TABLES `main_info` WRITE;
INSERT INTO `main_info` VALUES (1,1,15,90,20120501),(1,2,14,92,20120601),(1,3,15,82,20120801),(1,4,15,82,20120801),(1,5,15,82,20120802),(2,1,17,90,20130302),(2,2,17,90,20130302),(2,3,17,90,20130302),(2,4,16,88,20130601);
UNLOCK TABLES;


DROP TABLE IF EXISTS `product1`;
CREATE TABLE `product1` (
  `key1` int(11) NOT NULL,
  `key2` int(11) NOT NULL,
  `serial` int(11) NOT NULL,
  `product_data` varchar(1000) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


LOCK TABLES `product1` WRITE;
INSERT INTO `product1` VALUES (1,1,0,'NaN'),(1,1,1,'NaN'),(1,1,2,'NaN'),(1,1,3,'NaN'),(1,2,0,'12.556'),(1,2,1,'13.335'),(1,3,1,'NaN'),(1,3,2,'13.556'),(1,3,3,'14.556'),(1,4,3,'NaN'),(1,5,3,'NaN'),(2,1,0,'12.556'),(2,1,1,'13.553'),(2,1,2,'NaN'),(2,2,12,'129'),(2,3,22,'NaN');
UNLOCK TABLES;

请有人帮助我在一次查询中获得结果。


用 JOIN 将两个查询组合起来怎么样?

SQL:

 SELECT
    tbl1.key1, tbl1.key2, tbl1.info1, tbl1.info2, tbl1.serial_count, tbl1.serial_ids,
    tbl2.product_data_count, tbl2.product_data_ids
 FROM 
 (
select * , count(*) as serial_count,GROUP_CONCAT(key1,' ',key2) as serial_ids from 
 (
 SELECT distinct 
 if(b.serial  < 10,a.key1,null) AS `key1`,
 if(b.serial  < 10,a.key2,null) AS `key2`,
 if(b.serial  < 10,a.info1,null) AS `info1`, 
         if(b.serial  < 10,a.info2,null) AS `info2`
 FROM main_info a inner join product1 b on  a.key1 = b.key1 AND a.key2= b.key2
 ) as sub group by info1,info2
 ) tbl1
 LEFT OUTER JOIN 
 (
select * , count(*) as product_data_count,GROUP_CONCAT(key1,' ',key2) as product_data_ids from 
 (
 SELECT distinct 
 if(b.product_data IS NOT NULL,a.key1,null) AS `key1`,
 if(b.product_data IS NOT NULL,a.key2,null) AS `key2`,
 if(b.product_data IS NOT NULL,a.info1,null) AS `info1`, 
         if(b.product_data IS NOT NULL,a.info2,null) AS `info2`
 FROM main_info a inner join product1 b on  a.key1 = b.key1 AND a.key2= b.key2
 ) as sub group by info1,info2
 ) tbl2
 ON tbl1.info1 = tbl2.info1 AND tbl1.info2 = tbl2.info2
 ORDER BY 3,4
 ;

Output:

mysql>  SELECT
    -> tbl1.key1, tbl1.key2, tbl1.info1, tbl1.info2, tbl1.serial_count, tbl1.serial_ids,
    -> tbl2.product_data_count, tbl2.product_data_ids
    ->  FROM
    ->  (
    -> select * , count(*) as serial_count,GROUP_CONCAT(key1,' ',key2) as serial_ids from
    ->  (
    ->  SELECT distinct
    ->  if(b.serial  < 10,a.key1,null) AS `key1`,
    ->  if(b.serial  < 10,a.key2,null) AS `key2`,
    ->  if(b.serial  < 10,a.info1,null) AS `info1`,
    ->          if(b.serial  < 10,a.info2,null) AS `info2`
    ->  FROM main_info a inner join product1 b on  a.key1 = b.key1 AND a.key2= b.key2
    ->  ) as sub group by info1,info2
    ->  ) tbl1
    ->  LEFT OUTER JOIN
    ->  (
    -> select * , count(*) as product_data_count,GROUP_CONCAT(key1,' ',key2) as product_data_ids from
    ->  (
    ->  SELECT distinct
    ->  if(b.product_data IS NOT NULL,a.key1,null) AS `key1`,
    ->  if(b.product_data IS NOT NULL,a.key2,null) AS `key2`,
    ->  if(b.product_data IS NOT NULL,a.info1,null) AS `info1`,
    ->          if(b.product_data IS NOT NULL,a.info2,null) AS `info2`
    ->  FROM main_info a inner join product1 b on  a.key1 = b.key1 AND a.key2= b.key2
    ->  ) as sub group by info1,info2
    ->  ) tbl2
    ->  ON tbl1.info1 = tbl2.info1 AND tbl1.info2 = tbl2.info2
    ->  ORDER BY 3,4
    ->  ;
+------+------+-------+-------+--------------+-------------+--------------------+------------------+
| key1 | key2 | info1 | info2 | serial_count | serial_ids  | product_data_count | product_data_ids |
+------+------+-------+-------+--------------+-------------+--------------------+------------------+
| NULL | NULL |  NULL |  NULL |            1 | NULL        |               NULL | NULL             |
|    1 |    2 |    14 |    92 |            1 | 1 2         |                  1 | 1 2              |
|    1 |    3 |    15 |    82 |            3 | 1 3,1 4,1 5 |                  3 | 1 3,1 4,1 5      |
|    1 |    1 |    15 |    90 |            1 | 1 1         |                  1 | 1 1              |
|    2 |    1 |    17 |    90 |            1 | 2 1         |                  3 | 2 2,2 3,2 1      |
+------+------+-------+-------+--------------+-------------+--------------------+------------------+
5 rows in set (0.01 sec)

mysql>  select version();
+-----------------+
| version()       |
+-----------------+
| 10.1.10-MariaDB |
+-----------------+
1 row in set (0.00 sec)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql group_concat 重复键和1次查询中多列重复次数(查询优化) 的相关文章

  • 在 VBScript 中的 SQL 字符串中使用 Excel 命名范围

    我已经在这里和谷歌上搜索过 但仍然无法解决我的问题 我正在尝试在我的中等效地使用 Excel 的命名范围 vbs文件 下面的代码可以在 excel 中的 VBA 中运行 但我无法让它在 vbs file ThisWorkbook Sheet
  • 计算给定小时内使用了多少分钟

    给定开始和结束时间 我想知道给定时间内有多少分钟 create function CalcMinsInHour start datetime end datetime hour int returns int as begin Lookin
  • Django 在第二个数据库上调用存储过程

    我试图在多数据库 Django 安装上调用存储过程 但没有获得结果 存储过程 位于辅助数据库上 在 Django 中始终返回一个空数组 但在 mysql 客户端中执行时确实会出现预期结果 My view py文件 从 SomeDBModel
  • ubuntu上rails mysql gem问题

    Ruby on Rails 我想调用本地主机上的控制器 但服务器说 缺少 mysql gem 将其添加到您的 Gemfile 中 gem mysql 2 8 1 问题 当我点击 gem list 命令时 我得到了一个包含 mysql 2 8
  • MySQL:不喜欢

    我的数据库中有这些文本 categories posts categories news posts add news add 我不想选择带有categories 我使用这样的查询 SELECT FROM developer configu
  • MySQL 外键,无法创建表(错误号:150)

    我正在尝试为我的系统构建数据库和表 但我发现如果我不在代码中添加外键 没有错误 我使用了很多方法尝试使代码正常工作 但仍然有错误 我使用的是MySQL 5 5 31 代码如下 创建数据库服务条款 DROP TABLE TOS USER CA
  • LINQ 中的日期差异逻辑

    我尝试从两个不同的数据库表访问数据 然后使用 C 中的 LINQ 将它们连接到两个字段上 我相信我有一个逻辑合理的整体工作方法 我遇到的部分问题是 我在连接两个表之前过滤了它们的数据 因为这些表的数据太多 会导致崩溃 主要问题是 对于其中一
  • 如何配置 Spring boot 以使用两个数据库?

    我在用春季启动 2 X with 休眠5连接两个不同的 MySQL 数据库 Bar 和 Foo 在不同的服务器上 我试图列出一个实体的所有信息 自己的属性和 OneToMany and ManyToOne关系 来自 REST 控制器中的方法
  • 如何使用 OOP 从另一个 .php 到另一个 .php 的类使用 $db?

    我是 OOP PHP 的新手 自从开始 Web 开发以来我一直在使用过程 API 所以我很难迁移到 OOP 假设我有这四个 php文件和结构如下 连接 db php
  • 将 mysql 连接传递给 python 线程时管道损坏

    我正在尝试将 mysql 连接传递给 python 中的线程 如果我在工作类中进行 mysql 的初始化 则不会出现错误 但是 连接的成本可能很高 因此我尝试仅从调用者函数传递 mysql 连接 请参见下面的代码 但这一直抛出这个错误 20
  • 从 MySql 迁移到 Sql Server 2008

    我有大约 200 GB 的 Mysql 转储文件 现在我需要迁移到 Sql server 2008 那么我应该遵循什么方法 我应该继续逐行 sql 语句还是有任何适合我的要求的 GUI 工具 微软 SQL Server 迁移 Assista
  • SQL 中WITH 子句的使用指南

    我了解如何使用WITH递归查询子句 但我在理解它的一般用途 功能时遇到问题 例如 以下查询更新一条记录 其 id 是通过使用按时间戳返回第一条记录 id 的子查询来确定的 update global prospect psp set sta
  • varchar 值的转换溢出了 int 列

    对于某些值 nReservationID SELECT phoneNumber CASE WHEN ISNULL rdg2 nPhoneNumber 0 0 THEN ISNULL rdg2 nMobileNumber 0 ELSE ISN
  • 如何在 MS ACCESS 中使用与 Oracle Rownum 相同的函数

    我遇到一个问题 我做了一个可以通过检测滚动位置来加载数据的功能 该功能是用SQL语句 Rownum 制作的 它只在Oracle中有效 但在ACCESS中无效 我想查询数据并进行处理 ID value 1 aa 3 bb 使用 Rownum
  • Laravel 显示按年或月分组的记录详细信息

    我刚刚迁移到 Laravel 框架 并开始迁移一些遗留站点 但我遇到了 SQL 或 Blade 的问题 不知道是哪个 我必须显示大量的 运动类别 行 这些行按年份和月份分组 每个人都需要出勤等 我不确定继续走哪条路 我能够显示所有行并按日期
  • 按日期和时间降序排序?

    全部 我想显示特定 id 最后输入的 5 条数据 我的sql查询是 SELECT id name form id DATE updated at as date FROM wp frm items WHERE user id 11 form
  • MS Access - WHERE IN 有效,但 WHERE NOT IN 失败

    我在 MS Access 上有以下查询 简化 SELECT FROM table1 WHERE table1 ID NOT IN SELECT DISTINCT table1id FROM table2 我的问题是它不起作用 但是这两个起作
  • Android 和 Azure 移动服务:使用 invokeAPI 返回记录集

    我正在尝试一些非常简单的事情 我有一个名为 missingvehiclesfrominventoryjob 的自定义 API 它只是从标准 SQL 查询返回记录集 我可以在我的 WinForms 和 Windows Phone 应用程序中轻
  • 主键与主键

    创建包含数据库结构的 mysql 转储时 其中一张表显示以下内容 CREATE TABLE completedTransactions paymentId int 10 unsigned NOT NULL timestamp int 15
  • 远程数据库的“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障”

    我尝试连接到远程 MySQL 数据库 但失败并收到此错误 com mysql jdbc exceptions jdbc4 CommunicationsException Communications link failure 困惑的是 当我

随机推荐

  • 如何处理 WCF 客户端断开连接

    如何处理 WCF 客户端断开连接 我尝试过回调 但它似乎仅在客户端通过使用 断开连接 按钮 明确 断开连接时才有效 我希望我的服务器在客户端断开连接时收到通知 即使是手动断开连接或客户端进程崩溃 使用OperationContext Cur
  • 为什么 Firefox 以红色突出显示 HTML 过渡文档类型?

    看起来 Firefox 将其视为错误 这是什么意思 如果我将其更改为 Firefox 会正常处理它 顺便说一句 我使用的是 Firefox 12 0 如果您将鼠标悬停在该红线上 Firefox 会给您答案 几乎标准模式文档类型 预期的 查看
  • 在不使用HttpClient的情况下将处理后的JSP内容获取到spring控制器中?

    所以通常在 Spring 控制器中你只需返回一个ModelAndView对象并将请求转发到 JSP 我需要做的实际上是获取已处理的 JSP 的内容 这样我就可以在 JSONP 响应中发送它 例如 callback processed HTM
  • 如何控制哪些用户可以解密 SQL Server 对称密钥加密

    我正在考虑加密 SQL Server 中的一些敏感数据 例如银行帐号和社会安全号码 以便遵守新的州法律 我使用 SQL Server 2008 作为带有 NET 代码的数据库 我已经使用 NET 来加密密码 但为此我正在考虑使用 Micro
  • 具有归一化数据的 tanh 错误饱和度的神经网络

    我使用的神经网络由 4 个输入神经元组成 1 个由 20 个神经元组成的隐藏层和 7 个神经元输出层 我正在尝试将其训练为 bcd 到 7 段算法 我的数据已标准化 0 为 1 1 为 1 当输出错误评估发生时 神经元会错误饱和 如果期望的
  • 自动释放范围

    我想知道 autorelese 在 iPhone 上是如何工作的 我认为一旦你向对象发送自动释放这是有保证的保留在块的范围结束之前autorelease寄了 送了 那是对的吗 我正在从 NIB 中初始化一个视图applicationDidF
  • Java:按长度排序单词列表,然后按字母顺序排序

    有人告诉我有一个按长度排序的单词列表 并且那些具有相同长度的单词按字母顺序排序 这就是迄今为止我所拥有的实现这一点的方法 public static void doIt BufferedReader r PrintWriter w thro
  • iOS 版 Google 地图 API 的 API 密钥异常

    我正在使用适用于 IOS 的 Google 地图 API 开发 iOS 应用程序 我为我的项目安装了 CocoaPod 并根据 Google Developer 上的教程进行配置 但是 当我运行我的项目时 它说 由于未捕获的异常 GMSSe
  • 通过 ARM 创建与 Azure 表存储的 API 连接

    我正在尝试通过 ARM 模板将 API 连接部署到表格存储 但下面的模板返回错误 输入参数无效 请参阅详细信息以获取更多信息 详细信息 错误代码 参数未定义 消息 连接上不允许使用参数 accountKey 因为注册 API 时未将其定义为
  • 是否可以创建固定大小的过剩窗口?

    是否可以使用 glut 创建固定大小的窗口 因此窗口尺寸的任何更改都将被忽略 对我来说切换回 SDL 或类似的东西有点太晚了 显然 这是不可能以合法的方式 但你可以使用glutReshapeWindow在你的里面glutReshapeFun
  • SQLContext 隐式

    我正在学习 Spark 和 scala 我很精通java 但不太懂scala 我正在阅读关于 Spark 的教程 并遇到了以下代码行 该代码行尚未解释 val sqlContext new org apache spark sql SQLC
  • 如何消除此错误:“整数文字太大,无法用有符号整数类型表示”

    我有一份 C 语言的学校作业 我将用以下标志进行纠正 Wall Wextra Werror 所以这个无害的警告变成了一个错误并阻止编译 integer literal is too large to be represented in a
  • ActiveRecord Arel OR 条件

    如何使用逻辑 或 而不是 与 来组合 2 个不同的条件 NOTE 2 个条件是作为 Rails 范围生成的 并且不能轻易更改为类似的内容where x or y 直接地 简单的例子 admins User where kind gt adm
  • Xunit 为每个新测试创建 Test 类的新实例(使用 WebDriver 和 C#)

    有没有办法使用Webdriver Selenium 使用Xunit在同一浏览器中运行多个测试 目前xunit为每个新测试启动新的浏览器 下面是示例代码 public class Class1 private FirefoxDriver dr
  • 无法使用 pypy 安装 scipy (g++ 构建错误)

    截至 2020 年 可以使用 pypy 安装 scipy pypy下可以安装scipy吗 pypy3 mpip install scipy 然而 轮子因这种错误而失败 error Command g pthread DNDEBUG O2 f
  • 从Python中的字符串中删除控制字符

    我目前有以下代码 def removeControlCharacters line i 0 for c in line if c lt chr 32 line line i 1 line i 1 i 1 return line 如果要删除多
  • 如何在 Spark 中设置 Parquet 文件编码

    Parquet 文档描述了几种不同的编码here 它在读 写过程中是否会在文件内部发生某种变化 或者我可以设置它 Spark 文档中没有任何相关内容 只找到slides摘自 Netflix 团队 Ryan Blue 的演讲 他将 parqu
  • C++ 中的 const 和 static 说明符

    include
  • 如何在 VB NET 中将方法名称作为过程的参数传递

    我想创建一个过程 它的参数也是一个过程 是否可以 我创建了一些用作以下参数的过程 Private Sub Jump xStr as string Msgbox xStr is jumping End Sub Private Sub Run
  • Mysql group_concat 重复键和1次查询中多列重复次数(查询优化)

    这个问题是关于查询优化以避免通过 PHP 多次调用数据库 所以这是场景 我有两个表 一个包含您可以将其称为参考表的信息 另一个是数据表 字段key1 and key2这两个表都是通用的 根据这些字段 我们可以将它们连接起来 我不知道查询是否