php - Mysql 正则表达式查询查找略有不同的重复项

标签 php mysql regex

我有一个表,它有几个列,如 ID、名称等。还有一个列保存 JSON 对象。由于错误,某些行出现重复。我一直在尝试编写一个查询来查找所有重复项。

JSON 示例:

    {"flowId":"63","nodeId":2,"triggerLogId":"39397","modelId":"146",...}

我希望能够找到上述内容的副本,其中一切都相同,除了“triggerLogId”可能是两个不同的数字。

可能重复的 JSON 示例:

    {"flowId":"63","nodeId":2,"triggerLogId":"56217","modelId":"146",...}

如果两行上的triggerLogId相同,我想出了一些查询来执行此操作,但我似乎找不到任何可用于比较两列的正则表达式。

据我了解,MySQL 没有正则表达式反向引用,所以我不能使用它们。这在纯 MySQL 中可能吗? flowId 和 modelId 可以是不同的数字,因此拥有这些数字的列表是行不通的。

搜索了大部分堆栈溢出问题以及大量的谷歌结果,希望这里有人能知道一些我找不到的东西。 :P

我最终必须使用 PHP 吗?

编辑(表结构):

id ----- int(11) 自增
类型——varchar(20)
时间--bigint(20) NULL
数据--文本

最佳答案

这并不完全是一个答案。希望这能帮助某人或您自己找到答案。

使用此查询,您可以将数据值“转换”到不同的列中。

SELECT id,type,time,flowId,nodeId,triggerLogId,modelId FROM
(
SELECT *,
SUBSTR(data,LOCATE('flowId',data)+LENGTH('flowId')+2, LOCATE(',',data,LOCATE('flowId',data)+LENGTH('flowId')+3) - (LOCATE('flowId',data)+LENGTH('flowId')+2)) as flowId,
SUBSTR(data,LOCATE('nodeId',data)+LENGTH('nodeId')+2, LOCATE(',',data,LOCATE('nodeId',data)+LENGTH('nodeId')+3) - (LOCATE('nodeId',data)+LENGTH('nodeId')+2)) as nodeId,
SUBSTR(data,LOCATE('triggerLogId',data)+LENGTH('triggerLogId')+2, LOCATE(',',data,LOCATE('triggerLogId',data)+LENGTH('triggerLogId')+3) - (LOCATE('triggerLogId',data)+LENGTH('triggerLogId')+2)) as triggerLogId,
SUBSTR(data,LOCATE('modelId',data)+LENGTH('modelId')+2, LOCATE('}',data,LOCATE('modelId',data)+LENGTH('modelId')+3) - (LOCATE('modelId',data)+LENGTH('modelId')+2)) as modelId
FROM `my_table`
)
as foo

我将继续努力寻找您问题的答案并更新我的答案。

更新

这能解决您的问题吗?

SELECT CAST(GROUP_CONCAT(id) AS CHAR(1000)) as duplicated_rows
FROM `test`
GROUP BY CONCAT(SUBSTR(data,LOCATE('flowId',data)+LENGTH('flowId')+2, LOCATE(',',data,LOCATE('flowId',data)+LENGTH('flowId')+3) - (LOCATE('flowId',data)+LENGTH('flowId')+2)),
                                SUBSTR(data,LOCATE('nodeId',data)+LENGTH('nodeId')+2, LOCATE(',',data,LOCATE('nodeId',data)+LENGTH('nodeId')+3) - (LOCATE('nodeId',data)+LENGTH('nodeId')+2)),
                                SUBSTR(data,LOCATE('modelId',data)+LENGTH('modelId')+2, LOCATE('}',data,LOCATE('modelId',data)+LENGTH('modelId')+3) - (LOCATE('modelId',data)+LENGTH('modelId')+2)))
HAVING COUNT(*) > 1

删除重复项

我还不是 MySQL 方面的专家,所以可能(最肯定)这甚至不是最好的答案。为了删除重复的行并保留最后一行(即仅保留具有最高 id 的行),我们需要两个步骤:

  1. 获取我们要使用此查询删除的 ID 列表:

    选择 GROUP_CONCAT(delete_rows) 作为删除 ID FROM ( SELECT SUBSTR(GROUP_CONCAT(id),1,(LENGTH(GROUP_CONCAT(id)) - LOCATE(',',REVERSE(GROUP_CONCAT(id))))) as delete_rows 来自测试 GROUP BY CONCAT(SUBSTR(data,LOCATE('flowId',data)+LENGTH('flowId')+2, LOCATE(',',data,LOCATE('flowId',data)+LENGTH('flowId')+ 3) - (LOCATE('flowId',data)+LENGTH('flowId')+2)), SUBSTR(data,LOCATE('nodeId',data)+LENGTH('nodeId')+2, LOCATE(', ',data,LOCATE('nodeId',data)+LENGTH('nodeId')+3) - (LOCATE('nodeId',data)+LENGTH('nodeId')+2)), SUBSTR(data,LOCATE( 'modelId',data)+LENGTH('modelId')+2, LOCATE('}',data,LOCATE('modelId',data)+LENGTH('modelId')+3) - (LOCATE('modelId',数据)+LENGTH('modelId')+2)) ) 将 COUNT(*) > 1) 作为 foo 分组依据 '';

  2. 该查询将返回一个 ID 列表,例如 (1,5,7,8,10) 。在下一个查询中复制该列表:

    DELETE FROM test WHERE id IN <copy_list_here>

最终更新

我找到了一种仅使用一个查询即可完成此操作的方法。

DELETE FROM test WHERE FIND_IN_SET(id,
(SELECT GROUP_CONCAT(delete_rows) as delete_ids 
FROM ( SELECT SUBSTR(GROUP_CONCAT(id),1,(LENGTH(GROUP_CONCAT(id)) - LOCATE(',',REVERSE(GROUP_CONCAT(id))))) as delete_rows 
                FROM test 
                GROUP BY CONCAT(SUBSTR(data,LOCATE('flowId',data)+LENGTH('flowId')+2, LOCATE(',',data,LOCATE('flowId',data)+LENGTH('flowId')+3) - (LOCATE('flowId',data)+LENGTH('flowId')+2)), SUBSTR(data,LOCATE('nodeId',data)+LENGTH('nodeId')+2, LOCATE(',',data,LOCATE('nodeId',data)+LENGTH('nodeId')+3) - (LOCATE('nodeId',data)+LENGTH('nodeId')+2)), SUBSTR(data,LOCATE('modelId',data)+LENGTH('modelId')+2, LOCATE('}',data,LOCATE('modelId',data)+LENGTH('modelId')+3) - (LOCATE('modelId',data)+LENGTH('modelId')+2)) ) 
                HAVING COUNT(*) > 1) as foo 
GROUP BY ''
));

关于php - Mysql 正则表达式查询查找略有不同的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30897295/

相关文章:

php - 如果第二个数组具有与 PHP 匹配的 ID 键/值,则将数据添加到数组

php - 如何使用组合数据行在 MySQL 中获得 TOP 10?

mysql - 从 2 个表中选择记录

在 Notepad++ 中将 URL 转换为 HTML <a href> 超链接的正则表达式?

php - 用于将 xml 解析为数组的正则表达式

javascript - 正则表达式 : Match line of string that does not contain [ character

javascript - 使用 javascript 提交表单数据(无需重新加载页面)

javascript - 创建具有正确格式的索引 JSON

php - 从 php 运行可执行文件而不生成 shell

mysql - 如何获取 last 获取最后 7 个条目