删除mysql中的行

时间:2016-04-15 04:09:00

标签: mysql sql-delete

如果我有桌子:

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)

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

应该是这样的:

DELETE FROM 'myTable'
WHERE STRCMP(id1, id2) > 0;

STRCMP函数可以比较字符串并返回一个int。从那里它应该很容易 - 与上面非常相似的东西。如果您有进一步的麻烦,请告诉我。

答案 1 :(得分:1)

  • 在这种情况下,我们会分析Target.id1 > Target.id2这样的平均情况,例如(B, A, ??) B > A
    • 这也忽略了(A, A, ??)
    • 等情况
  • 然后使用自我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 |

答案 2 :(得分:1)

看起来你说的是......

如果表中有(id1,id2)元组,其值为例如(a,b),还有另一个元组(b,a)由相同的值组成,但在列中交换,你想要删除其中一个元组。看起来您要删除的是第一列中具有“更大”值的那个。

首先,确定“重复”元组。

现在,我们将忽略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

如果返回要删除的行集,我们可以将其转换为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