删除 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 并删除

SQL Fiddle Demo

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