起初,我非常怀疑之前没有人问过这个问题,但我所看到的所有答案都指向了数据库中的一个双重列。我有两个。
示例数据:
ID | identifier | meta_key | meta_value
1 | abc1234 | name | Niels
2 | abc1234 | name | Niels
3 | abc1234 | last_name | van R
4 | abc1234 | city | New York
5 | abc1234 | city | New York
现在,我想运行一个查询(在本例中为每日),该查询通过数据库并删除所有的错误,在这种情况下是具有匹配标识符和meta_keys的行。每个标识符meta_key在查询后应该是唯一的,应该保存具有最高ID的记录。查询后的示例数据
ID | identifier | meta_key | meta_value
2 | abc1234 | name | Niels
3 | abc1234 | last_name | van R
5 | abc1234 | city | New York
谁能指出我正确的方向?
答案 0 :(得分:0)
理论上你可以这样写:
DELETE FROM yourtable WHERE EXISTS(
SELECT 'OTHER'
FROM yourtable t2
WHERE t2.identifier = yourtable.identifier
AND t2.meta_key = yourtable.meta_key
AND t2.meta_value = yourtable.meta_value
AND t2.id > yourtable.id)
但在MySql中,不可能在DELETE和内部子查询上使用相同的表,因此您需要使用这样的临时表:
第一步:
CREATE TEMPORARY TABLE duplicated
(id int)
INSERT INTO duplited (id)
SELECT t1.id
FROM yourtable t1
WHERE EXISTS(
SELECT 'OTHER'
FROM yourtable t2
WHERE t2.identifier = t1.identifier
AND t2.meta_key = t1.meta_key
AND t2.meta_value = t1.meta_value
AND t2.id > t1.id)
第二步:
DELETE FROM yourtable WHERE id in (SELECT id FROM duplicated)
注意:更好的方法是使用替代密钥防止重复行,例如,您可以添加关于三个字段标识符,meta_key,meta_value的唯一约束;像这样:
ALTER TABLE yourtable ADD UNIQUE (identifier, meta_key, meta_value)