当前位置: 首页 > 面试题库 >

如何在整个子查询上使用group_concat?

禹智渊
2023-03-14
问题内容

…无需进行不必要的比较

我想获取一系列行的md5哈希。由于带宽限制,我希望它发生在服务器端。

这有效:

create table some_table (id int auto_increment,
                         col1 varchar(1),
                         col2 int,
                         primary key (id));

insert into some_table (col1, col2)
                values ('a', 1),
                       ('b', 11),
                       ('c', 12),
                       ('d', 25),
                       ('e', 50);

select group_concat(id,col1,col2) from
    (select * from some_table
     where id >= 2 and id < 5
     order by id desc) as some_table
group by 1 = 1;

输出:

+----------------------------+
| group_concat(id,col1,col2) |
+----------------------------+
| 2b11,3c12,4d25             |
+----------------------------+

并带有哈希:

select md5(group_concat(id,col1,col2)) from
    (select * from some_table
     where id >= 2 and id < 5
     order by id desc) as some_table
group by 1 = 1;

输出:

+----------------------------------+
| md5(group_concat(id,col1,col2))  |
+----------------------------------+
| 32c1f1dd34d3ebd33ca7d95f3411888e |
+----------------------------------+

但是我觉得应该有更好的方法。

特别是,我想避免将1与1百万次进行比较,这是我发现将行范围划分为一组所必需的,这是我需要使用的group_concat,而md5在多行中使用是必须的。

有没有一种方法可以group_concat在行范围内使用(或类似方法)而无需进行不必要的比较?

编辑

我想对多行进行哈希处理,以便可以比较不同服务器上产生的哈希值。如果它们不同,则可以得出结论,子查询返回的行存在差异。


问题答案:

解决方案就是完全省略group by 1 = 1。我假设这group_concat将要求我为其提供一个组,但是可以将其直接用于子查询,如下所示:

select group_concat(id,col1,col2) from
    (select * from some_table
     where id >= 2 and id < 5
     order by id desc) as some_table;

请注意,需要将null值强制转换为concat-friendly,例如:

insert into some_table (col1, col2)
                values ('a', 1),
                       ('b', 11),
                       ('c', NULL),
                       ('d', 25),
                       ('e', 50);

select group_concat(id, col1, col2) from
    (select id, col1, ifnull(col2, 'NULL') as col2
     from some_table
     where id >= 2 and id < 5
     order by id desc) as some_table;

输出:

+------------------------------+
| group_concat(id, col1, col2) |
+------------------------------+
| 2b11,3cNULL,4d25             |
+------------------------------+

另一个警告:mysql的最大长度group_concat由变量:定义group_concat_max_len。为了散列 n个
表行的串联,我需要:

  1. 哈希行,使其以32位表示,而不管其具有多少列
  2. 确保group_concat_max_len > (n * 33)(多余的字节用于添加逗号)
  3. group_concat列哈希行。

最终,我最终使用了客户端语言来检查每列的名称,编号和可空性,然后构建如下查询:

select md5(group_concat(row_fingerprint)) from
    (select concat(id, col1, ifnull(col2, 'null')) as row_fingerprint
     from some_table
     where id >= 2 and id < 5
     order by id desc) as foo;

有关更多详细信息,您可以在此处浏览我的代码(请参见函数:find_diff_intervals)。



 类似资料:
  • 我必须得到特定的数据,如"角色"表已提交状态,我需要状态=1,所有数据从角色表

  • 问题内容: 有没有办法找出Python用来为其随机数生成器提供种子的种子? 我知道我可以指定自己的种子,但是我对Python对其进行管理感到非常满意。但是,我确实想知道它使用了什么种子,因此,如果我喜欢在特定运行中获得的结果,则可以稍后重现该运行。如果我拥有使用过的种子,那我可以。 如果答案是我不能,那么自己生成种子的最佳方法是什么?我希望它们在每次运行中始终保持不同-我只想知道使用了什么。 更新

  • 问题内容: 我有一个充满随机内容项ID的数组。我需要运行mysql查询(数组中的ID在WHERE子句中),并使用数组中的每个ID并按照它们在所述数组中出现的顺序进行操作。我该怎么做? 对于数组中的每个ID,这将是一个UPDATE查询。 问题答案: 与几乎所有“如何在PHP中执行SQL”问题一样,您 实际上 应该使用准备好的语句。这并不难: 或者,您可以这样做: 根据需要为其他字段添加更多参数占位符

  • 问题内容: 我有如下查询 我想以某种方式重用 我简化了上面的查询,但是实际上上面的选择是巨大而复杂的。我不想负担确保两者同步 我没有任何以编程方式重用它的方法。排除了T-SQL。我只能写简单的查询。这是应用程序的限制。 有没有一种方法可以在单个语句中重用相同的子查询 问题答案: 如果您使用的是SQL Server 2005+,请使用公用表表达式(CTE):

  • 关于子查询使用 利用子查询进行过滤 列出够物品RGAN01的所有客户。 检索包含物品RGAN01的所有订单编号。 检索具有前一步骤列出的订单编号所有客户ID。 检索前一步骤返回的所有客户ID的客户信息。 mysql> SELECT order_num -> FROM OrderItems -> WHERE prod_id = 'RGAN01'; +-----------+ | or

  • 问题内容: 如何在按部分分组的查询中使用子查询? 我使用SQL Server 2008 R2和Delphi 2010 我收到此错误: 像这个查询: 按t1.sen分组 问题答案: 这是真实的方式