mysql - 删除两个值匹配的行,mysql

标签 mysql

我想要除一行之外的所有行都包含相同的数据,问题是数据在多个字段中。

|id | ValA | ValB  |
|1  | abc  | abc   |
|2  | abc  | abc   |
|3  | abc  | def   |

在上面的示例表中,我想删除 ID 为 2 的行,并保留 1 和 3。

我能找到的唯一解决方案是在 PHP 中使用循环,但我有 170 万条记录,所以我不知道要循环遍历所有这些值。

我认为“SQL 方式”将是子查询,但我无法解决它们

谢谢

最佳答案

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,vala CHAR(3) NOT NULL
,valb CHAR(3) NOT NULL
);

INSERT INTO my_table VALUES
(1  ,'abc','abc'),
(2  ,'abc','abc'),
(3  ,'abc','def');

SELECT * FROM my_table;
+----+------+------+
| id | vala | valb |
+----+------+------+
|  1 | abc  | abc  |
|  2 | abc  | abc  |
|  3 | abc  | def  |
+----+------+------+


SELECT * 
  FROM my_table x 
  LEFT 
  JOIN my_table y 
    ON y.vala = x.vala 
   AND y.valb = x.valb 
   AND y.id < x.id;
+----+------+------+------+------+------+
| id | vala | valb | id   | vala | valb |
+----+------+------+------+------+------+
|  1 | abc  | abc  | NULL | NULL | NULL |
|  2 | abc  | abc  |    1 | abc  | abc  |
|  3 | abc  | def  | NULL | NULL | NULL |
+----+------+------+------+------+------+

SELECT x.* 
  FROM my_table x 
  LEFT 
  JOIN my_table y 
    ON y.vala = x.vala 
   AND y.valb = x.valb 
   AND y.id < x.id 
 WHERE y.id IS NULL;
+----+------+------+
| id | vala | valb |
+----+------+------+
|  1 | abc  | abc  |
|  3 | abc  | def  |
+----+------+------+

SELECT x.*  
  FROM my_table x 
  JOIN my_table y 
    ON y.vala = x.vala 
   AND y.valb = x.valb 
   AND y.id < x.id;
+----+------+------+
| id | vala | valb | 
+----+------+------+
|  2 | abc  | abc  | 
+----+------+------+

DELETE x 
  FROM my_table x 
  JOIN my_table y 
    ON y.vala = x.vala 
   AND y.valb = x.valb 
   AND y.id < x.id;

SELECT * FROM my_table;
+----+------+------+
| id | vala | valb |
+----+------+------+
|  1 | abc  | abc  |
|  3 | abc  | def  |
+----+------+------+

关于mysql - 删除两个值匹配的行,mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28842880/

相关文章:

php - 使用 1 个查询查询具有多个 GET 函数的多个表

jquery - Masonry 无法处理从 mysql 获取的图像

mysql - Node.js 和 MySQL : HTTP server stops after first run

mysql - 如何在 mySQL 中使用 bash 别名

java - 从 MySQL 数据库读取文本文件并写入项目文件夹时额外写入一行

python - 使用python在MySQL中进行远程查询

Python mysql.connector 内部错误 : Unread result found when close cursor

mysql - 按日期从数据库中选择,但不包含日、月和年

mysql - 如何在 IN 子句中使用 max 函数

mysql - 生产系统 Spring 数据库池的最佳方式