mysql - 返回所有 colA 与 colB 不重复的 MySQL 行

标签 mysql sql

我们正在尝试查找 MySQL 数据库中的数据错误,但我想不出一种在不破坏数据库的情况下处理此问题的方法。

这是数据模型:

Table: EXAMPLE
+-----+------+-------+
| ID  |  PID |  YEAR |
+-----+------+-------+
|     |      |       |
| 001 |  A   |  2014 |
|     |      |       |
| 002 |  B   |  2014 |
|     |      |       |
| 003 |  A   |  2014 |
|     |      |       |
| 004 |  A   |  2009 |
|     |      |       |
| 005 |  B   |  2014 |
|     |      |       |
| 006 |  C   |  2014 |
|     |      |       |
| 007 |  C   |  2014 |
+-----+------+-------+

目标是返回 PID 和 YEAR 彼此不同步的所有行。如果有三行 PID 匹配但其中任何一行的 YEAR 错误,我们需要返回所有行。

在上面的示例数据中,将返回以下内容:

+-----+------+-------+
| ID  |  PID |  YEAR |
+-----+------+-------+
|     |      |       |
| 001 |  A   |  2014 |
|     |      |       |
| 003 |  A   |  2014 |
|     |      |       |
| 004 |  A   |  2009 |
+-----+------+-------+

到目前为止,我处理的查询如下所示:

SELECT EXAMPLE.ID, EXAMPLE.PID, EXAMPLE.YEAR 
FROM EXAMPLE
INNER JOIN
(SELECT PID FROM EXAMPLE where PID HAVING COUNT(PID) > 1 GROUP BY PID) tmpTbl
ON EXAMPLE.PID = tmpTbl.PID

问题是在我的真实数据集中,子查询返回数据库中 255k 行中的 26k。预期结果不是“这是你的结果”,而是更多“观看我的处理动画”。

我走在正确的轨道上吗?有没有我忽略的更有效的方法?

非常感谢!

最佳答案

您可以使用 exists 子查询代替:

select e.*
from example e
where exists (select 1
              from example e2
              where e2.pid = e.pid and
                    e2.year <> e.year
             );

为了让它运行得更快,在 example(pid, year) 上创建一个索引。

如果您只想要所有年份并且可以将它们排成一行,那么这可能就足够了:

SELECT PID, group_concat(year) as years
FROM EXAMPLE
where PID
GROUP BY PID
HAVING COUNT(DISTINCT year) > 1 ;

关于mysql - 返回所有 colA 与 colB 不重复的 MySQL 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21736159/

相关文章:

php - 控制excel导出

ruby - 尝试使用 Rails 4.0.0 设置 ROR 环境,但 Webrick Webserver 无法运行 uaing Rails

c# - 如何通过 C# 运行 mysqlcheck

SQL 选择两个表中的行

sql - 引用非主键列创建表

mysql - 连接多个 mysql 表中的数据

php - 如何从一行中选择多个值并将其连接为单个列值

mysql - 如何将多个 WHERE 子句分组在括号中以获得更准确的结果

sql - 如何获得最年长的人?

php - 在 sql 和 php 中更新多行