SQL Query删除两行,其中字符串值的结尾相同

时间:2016-01-11 03:55:00

标签: mysql sql

我的表格有4列(idnamevaluegroup)和~150,000行。

我需要删除name列值以相同字符串(uuid)结尾的任何两行集的所有出现,并且第二行的value列值在指定之前日期。

name列值始终以两个字符串中的一个开头:st1_始终在value列中包含json数据,st2_value中始终具有unix时间戳{1}}栏。

以下是一个示例集(group列已删除,因为它无关紧要):

╔════╦═══════════╦════════════╗
║ id ║   name    ║   value    ║
╠════╬═══════════╬════════════╣
║ 1  ║ st1_uuid1 ║ {json}     ║
║ 2  ║ st2_uuid1 ║ 1448880401 ║
║ 3  ║ st1_uuid2 ║ {json}     ║          
║ 4  ║ st2_uuid2 ║ 1448880414 ║
║ 5  ║ st1_uuid3 ║ {json}     ║    
║ 6  ║ st2_uuid3 ║ 1448880468 ║
╚════╩═══════════╩════════════╝

在此示例中,如何根据其unix时间戳写入删除行1-4的查询?

SQLFiddle

2 个答案:

答案 0 :(得分:1)

以下查询应该可以正常运行,假设在确定重复项时,所有出现多次的uuid值都应该一起考虑。

DELETE FROM yourTable
WHERE RIGHT(name, 32) IN (SELECT * 
             FROM (SELECT RIGHT(name, 32) FROM yourTable 
                   GROUP BY RIGHT(name, 32)
                   HAVING COUNT(*) > 1 AND
                   MIN(CASE WHEN value REGEXP '[0-9]+' THEN CAST(value AS UNSIGNED) ELSE ~0 END) < someValue
                  ) AS t
            )

以下是SQL Fiddle,证明GROUP BY查询正确识别了应在给定时间戳uuids下删除的记录中的someValue

SQLFiddle

答案 1 :(得分:0)

此查询创建一个字符串,如&#34; st1_uuid1,st2_uuid1,st1_uuid3,st2_uuid3,&#34;带有需要删除的变量名称,并检查每个记录的名称是否在此字符串中。

DELETE FROM Table1 WHERE 
INSTR((SELECT * FROM (
SELECT GROUP_CONCAT( CONCAT('st1_uuid',SUBSTRING(name,9),',',name) SEPARATOR ', ') 
FROM Table1 WHERE value REGEXP '^[0-9]+$' AND value<1448880414) as t), name);

如果可以假设变量st1_uuidX和st2_uuidX将具有连续的id号,那么如果我们知道st2_uuidX的id号,那么st1_uuidX的id应该是1减去st2_uuidX的id。

FROM Table1 WHERE id IN 
(SELECT * FROM (SELECT id FROM Table1 WHERE value REGEXP '^[0-9]+$' AND value<1448880414) as t) 
OR id IN (SELECT * FROM (SELECT id-1 FROM Table1 WHERE value REGEXP '^[0-9]+$' AND value<1448880414) as r)

两个查询都经过测试。