我怎样才能在mysql中找到缺少的id

时间:2016-12-25 16:34:18

标签: mysql

我有一个超过100万行的大型MySQL数据库。我怎样才能找到丢失的开斋节?

+----+-----+
| id | eid |
+----+-----+
|  1 |  1  |
+----+-----+
|  2 |  2  |
+----+-----+
|  3 |  4  |
+----+-----+

我想列出所有缺少的eid,在本例中为3。我已经尝试了很多东西,但是我所做的一切都需要很长时间。

我希望有人可以帮助我。

由于

4 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS查找所需的行。

create table t(id integer, eid integer);
insert into t values(1,1);
insert into t values(2,2);
insert into t values(3,4);

SELECT id
FROM t a
WHERE NOT EXISTS
    ( SELECT 1
     FROM t b
     WHERE b.eid = a.id );

或使用NOT IN

SELECT ID
FROM t
WHERE ID NOT IN
    (SELECT EID
     FROM t);

产生

| id |
|----|
|  3 |

答案 1 :(得分:0)

尝试以下查询

SELECT ID FROM table WHERE ID NOT IN(SELECT EID FROM table );

答案 2 :(得分:0)

查找重复的数字很简单:

从序列中选择id,count() 按ID分组 有计数()> 1;

在这种情况下没有重复,因为我在这篇文章中没有集中精力(发现副本很简单,我希望你能看到它是如何完成的)。不过,我不得不抓头一秒钟才能找到序列中缺少的数字。这是我的第一次拍摄:

选择l.id + 1作为开始 从序列为l   左外连接序列为l.id + 1 = r.id上的r 其中r.id为null;

这个想法是对同一序列排除连接,但是移动了一个位置。具有相邻数字的任何数字都将成功连接,WHERE子句将消除成功匹配,留下缺少的数字。结果如下:

https://www.xaprb.com/blog/2005/12/06/find-missing-numbers-in-a-sequence-with-sql/

答案 3 :(得分:0)

如果您想要一种更轻松的方式来搜索数百万行数据,

我尝试使用旧 CPU 搜索超过 2300 万行(12.6Gb 数据需要大约 1GB 空闲内存): 受影响的行:0 找到的行:346.764 警告:0 2 次查询的持续时间:00:04:48.0(+ 2,656 秒网络)

SET @idBefore=0, @st=0,@diffSt=0,@diffEnd=0;
SELECT res.idBefore `betweenID`, res.ID `andNextID`
 , res.startEID, res.endEID
 , res.diff `diffEID`
-- DON'T USE this missingEIDfor more than a thousand of rows
-- this is just for sample view
 , GROUP_CONCAT(b.aNum) `missingEID`
FROM (
  SELECT
    @idBefore `idBefore`
    , @idBefore:=(a.id) `ID`
    , @diffSt:=(@st) `startEID`
    , @diffEnd:=(a.eid) `endEID`
    , @st:=a.eid `end`
    , @diffEnd-@diffSt-1 `diff`
    FROM eid a 
  ORDER BY a.ID
  ) res
-- DON'T USE this integers for more than a thousand of rows
-- this is just for sample view
CROSS JOIN (SELECT a.ID + (b.ID * 10) + (c.ID * 100) AS aNum FROM integers a, integers b, integers c) b
WHERE res.diff>0 AND b.aNum BETWEEN res.startEID+1 AND res.endEID-1
GROUP BY res.ID;

看看这个http://sqlfiddle.com/#!9/33deb3/9 这是因为缺少 ID http://sqlfiddle.com/#!9/3ea00c/9