我有一个超过100万行的大型MySQL数据库。我怎样才能找到丢失的开斋节?
+----+-----+
| id | eid |
+----+-----+
| 1 | 1 |
+----+-----+
| 2 | 2 |
+----+-----+
| 3 | 4 |
+----+-----+
我想列出所有缺少的eid,在本例中为3。我已经尝试了很多东西,但是我所做的一切都需要很长时间。
我希望有人可以帮助我。
由于
答案 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