[英]How to check if a row does not exist in a database
我有以下設置:
a
, b
, c
列a
表格。 表包含類似的行
1 1 i1 1 1 i2 . . . . . . . . . 1 1 in 1 2 i1 . . . . . . . . . 2 1 i1 2 2 i2
問題是並非所有記錄都在那里。 例如,行1 2 i1可能丟失。
我想做什么,從查詢(沒有得到所有行並遍歷它們)是看IF是否缺少任何行(我不關心女巫一,只有IF丟失)。
對於一個更為復雜的問題,這是一個非常簡單的例子,所以如果我沒有公開它,或者我忘了提及任何可以隨意詢問細節的事情。
PHP中的select和process是可以接受的,只要我不選擇表中的所有內容(雖然我沒有看到如何通過處理數據而不選擇所有內容但感覺值得一提)。
有些人問了一個模式......
讓我們簡化一些......讓我們說第一列有一個可以在那里找到的可能數據的數組,對於第2列是相同的,並且已經在第3列中說過了。所有可能的組合應該在表格中找到。 我需要知道是否有任何遺漏......
假設您知道他對a和b列的值,您可以嘗試以下方法:
select c, count (*) group by c;
這會告訴你每個值有多少條目。
i1 3
i2 0
in 3
然后你可以迭代這個結果,看看有什么不見了
假設我們有一個包含此數據的表。
mysql> SELECT * FROM stuff;
+------+------+------+
| a | b | c |
+------+------+------+
| 1 | 1 | i1 |
| 1 | 1 | i2 |
| 1 | 2 | i2 |
| 1 | 2 | i3 |
| 2 | 1 | i1 |
+------+------+------+
5 rows in set (0.00 sec)
讓我們假設C的所有可能值都在表中。 然后我們可以像這樣構造一個引用表。
mysql> SELECT a,b,c FROM (SELECT DISTINCT a,b FROM stuff) t1 CROSS JOIN (SELECT DISTINCT c FROM stuff) t2;
+------+------+------+
| a | b | c |
+------+------+------+
| 1 | 1 | i1 |
| 1 | 2 | i1 |
| 2 | 1 | i1 |
| 1 | 1 | i2 |
| 1 | 2 | i2 |
| 2 | 1 | i2 |
| 1 | 1 | i3 |
| 1 | 2 | i3 |
| 2 | 1 | i3 |
+------+------+------+
9 rows in set (0.00 sec)
然后我們可以將表與實際數據和參考表進行比較,將它們連接在一起,得到所有缺少的行,如下所示:
mysql> SELECT * FROM stuff RIGHT JOIN (SELECT a,b,c FROM (SELECT DISTINCT a,b FROM stuff) t1 CROSS JOIN (SELECT DISTINCT c FROM stuff) t2) r ON stuff.a = r.a AND stuff.b = r.b AND stuff.c = r.c WHERE stuff.a IS NULL;
+------+------+------+------+------+------+
| a | b | c | a | b | c |
+------+------+------+------+------+------+
| NULL | NULL | NULL | 1 | 2 | i1 |
| NULL | NULL | NULL | 2 | 1 | i2 |
| NULL | NULL | NULL | 1 | 1 | i3 |
| NULL | NULL | NULL | 2 | 1 | i3 |
+------+------+------+------+------+------+
4 rows in set (0.00 sec)
A,b,c上的右連接將使參考表r中的行與實際行匹配。 丟失的行將在stuff端顯示為NULL。 因此,我們可以通過在stuff表中選擇任何帶有NULL字段的行來獲取所有缺失的行。
編輯:您可以將最后一個查詢中的SELECT * ...
更改為SELECT count(*) ...
並在這種情況下獲得缺失的行數4。
您可以通過簡單的計數來完成此操作。 預期行數是A中不同元素的數量,B中不同元素的數量乘以C中不同元素的數量。
要計算缺失的數字,只需對適當的值進行算術運算:
select (cnt - cntA*cntB*cntC) as NumMissingRows
from (select count(distinct a) as cntA,
count(distinct b) as cntB,
count(distinct c) as cntC,
count(*) as cnt
from t
) t
這樣的查詢怎么樣,這可能不是最佳性能,但對於一次性任務,這應該有效。
SELECT t1.id,
(
SELECT t2.id FROM table t2 WHERE t2.id < t1.id ORDER BY t2.id DESC LIMIT 1
) as prv
FROM table t1
HAVING id <> prv + 1
我會考慮這樣做,即使你的值列表中有重復項,它仍然可以工作。 這樣做會對結果字段進行任何循環(只返回一行,這將告訴您在表中找不到數組中有多少唯一行。
SELECT COUNT(*)
FROM (SELECT 'i1' AS aCol
UNION
SELECT 'i2' AS aCol
UNION
SELECT 'i3' AS aCol
UNION
.......
UNION
SELECT 'in' AS aCol) Sub1
LEFT OUTER JOIN aTable
ON Sub1.aCol = aTable.c
WHERE aTable.c IS NULL
也可以非常容易地修改,以便在將來需要時找回未找到的項目列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.