删除 mysql 中的行
delete rows in mysql
如果我有 table:
id1 id2 count
A A 1
A B 2
A C 1
B A 3
B B 1
B C 2
C A 3
C B 2
C C 1
删除后我想要的:
id1 id2 count
A A 1
A B 2
A C 1
B B 1
B C 2
C C 1
这意味着如果我有 A(id1) --> B(id2) 然后删除 B(id1) --> A(id2)。与 B(id1) --> C(id2) 相同,然后删除行 C(id1) --> B(id2)
感谢您的帮助!
应该是这样的:
DELETE FROM 'myTable'
WHERE STRCMP(id1, id2) > 0;
STRCMP
函数可以比较字符串和 return 一个 int。从那里应该很容易 - 与上面的非常相似。如果您还有其他问题,请告诉我。
- 在这种情况下,我们分析
Target.id1 > Target.id2
平均情况,例如 (B, A, ??)
其中 B > A
- 这也会忽略像
(A, A, ??)
这样的情况
- 然后使用 self
left join
尝试使用 (A, B, ??)
找到另一行
- 如果我们找到匹配项,则
Source.id1 IS NOT NULL
并删除
DELETE Target
FROM Table1 Target
LEFT JOIN Table1 Source
ON Target.`id1` = Source.`id2`
AND Target.`id2` = Source.`id1`
AND Target.`id1` > Target.`id2`
WHERE Source.`id1` IS NOT NULL;
输出
| id1 | id2 | count |
|-----|-----|-------|
| A | A | 1 |
| A | B | 2 |
| A | C | 1 |
| B | B | 1 |
| B | C | 2 |
| C | C | 1 |
看来你说的是...
如果 table 中有一个 (id1,id2) 元组,其值例如(a,b),还有另一个元组 (b,a)
,它包含相同的值,但在列中交换了位置,您想要删除其中一个元组。您要删除的似乎是第一列中具有 "greater" 值的那个。
首先,确定 "duplicate" 个元组。
现在,我们将忽略 id1 和 id2 的值相同的元组,例如(a,a)
.
SELECT s.id1
, s.id2
FROM mytable s
WHERE s.id1 > s.id2
AND EXISTS ( SELECT 1
FROM mytable r
WHERE r.id1 = s.id2
AND r.id2 = s.id1
)
ORDER BY s.id1, s.id2
如果 returns 您要删除的行集,我们可以将其转换为 DELETE。为此,我们需要将该查询更改为内联视图,
我们可以重新写成这样,验证我们得到了相同的结果。
SELECT o.id1, o.id2
FROM ( SELECT q.id1, q.id2
FROM ( SELECT s.id1, s.id2
FROM mytable s
WHERE s.id1 > s.id2
AND EXISTS ( SELECT 1
FROM mytable r
WHERE r.id1 = s.id2
AND r.id2 = s.id1
)
) q
GROUP BY q.id1, q.id2
) p
JOIN mytable o
ON o.id1 = p.id1
AND o.id2 = p.id2
ORDER BY o.id1, o.id2
然后我们可以将其转换为 DELETE 语句,将 SELECT o.id1, o.id2
替换为 DELETE o.*
并删除 ORDER BY...
DELETE o.*
FROM ( SELECT q.id1, q.id2
FROM ( SELECT s.id1, s.id2
FROM mytable s
WHERE s.id1 > s.id2
AND EXISTS ( SELECT 1
FROM mytable r
WHERE r.id1 = s.id2
AND r.id2 = s.id1
)
) q
GROUP BY q.id1, q.id2
) p
JOIN mytable o
ON o.id1 = p.id1
AND o.id2 = p.id2
如果我有 table:
id1 id2 count
A A 1
A B 2
A C 1
B A 3
B B 1
B C 2
C A 3
C B 2
C C 1
删除后我想要的:
id1 id2 count
A A 1
A B 2
A C 1
B B 1
B C 2
C C 1
这意味着如果我有 A(id1) --> B(id2) 然后删除 B(id1) --> A(id2)。与 B(id1) --> C(id2) 相同,然后删除行 C(id1) --> B(id2)
感谢您的帮助!
应该是这样的:
DELETE FROM 'myTable'
WHERE STRCMP(id1, id2) > 0;
STRCMP
函数可以比较字符串和 return 一个 int。从那里应该很容易 - 与上面的非常相似。如果您还有其他问题,请告诉我。
- 在这种情况下,我们分析
Target.id1 > Target.id2
平均情况,例如(B, A, ??)
其中B > A
- 这也会忽略像
(A, A, ??)
这样的情况
- 这也会忽略像
- 然后使用 self
left join
尝试使用(A, B, ??)
找到另一行
- 如果我们找到匹配项,则
Source.id1 IS NOT NULL
并删除
DELETE Target
FROM Table1 Target
LEFT JOIN Table1 Source
ON Target.`id1` = Source.`id2`
AND Target.`id2` = Source.`id1`
AND Target.`id1` > Target.`id2`
WHERE Source.`id1` IS NOT NULL;
输出
| id1 | id2 | count |
|-----|-----|-------|
| A | A | 1 |
| A | B | 2 |
| A | C | 1 |
| B | B | 1 |
| B | C | 2 |
| C | C | 1 |
看来你说的是...
如果 table 中有一个 (id1,id2) 元组,其值例如(a,b),还有另一个元组 (b,a)
,它包含相同的值,但在列中交换了位置,您想要删除其中一个元组。您要删除的似乎是第一列中具有 "greater" 值的那个。
首先,确定 "duplicate" 个元组。
现在,我们将忽略 id1 和 id2 的值相同的元组,例如(a,a)
.
SELECT s.id1
, s.id2
FROM mytable s
WHERE s.id1 > s.id2
AND EXISTS ( SELECT 1
FROM mytable r
WHERE r.id1 = s.id2
AND r.id2 = s.id1
)
ORDER BY s.id1, s.id2
如果 returns 您要删除的行集,我们可以将其转换为 DELETE。为此,我们需要将该查询更改为内联视图,
我们可以重新写成这样,验证我们得到了相同的结果。
SELECT o.id1, o.id2
FROM ( SELECT q.id1, q.id2
FROM ( SELECT s.id1, s.id2
FROM mytable s
WHERE s.id1 > s.id2
AND EXISTS ( SELECT 1
FROM mytable r
WHERE r.id1 = s.id2
AND r.id2 = s.id1
)
) q
GROUP BY q.id1, q.id2
) p
JOIN mytable o
ON o.id1 = p.id1
AND o.id2 = p.id2
ORDER BY o.id1, o.id2
然后我们可以将其转换为 DELETE 语句,将 SELECT o.id1, o.id2
替换为 DELETE o.*
并删除 ORDER BY...
DELETE o.*
FROM ( SELECT q.id1, q.id2
FROM ( SELECT s.id1, s.id2
FROM mytable s
WHERE s.id1 > s.id2
AND EXISTS ( SELECT 1
FROM mytable r
WHERE r.id1 = s.id2
AND r.id2 = s.id1
)
) q
GROUP BY q.id1, q.id2
) p
JOIN mytable o
ON o.id1 = p.id1
AND o.id2 = p.id2