Php 如何检查数据库中是否不存在行

Php 如何检查数据库中是否不存在行,php,mysql,sql,Php,Mysql,Sql,我有以下设置: 包含A、b、c列的表。 具有随机数目的项i1、i2、i3…的数组,。。。在里面 表包含如下行 1 1 i1 1 1 i2 . . . . . . . . . 1 1 in 1 2 i1 . . . . . . . . . 2 1 i1 2 2 i2 问题是并不是所有的记录都存在。例如,可能

我有以下设置:

包含A、b、c列的表。 具有随机数目的项i1、i2、i3…的数组,。。。在里面 表包含如下行

1      1    i1
1      1    i2
.      .    .
.      .    .
.      .    .
1      1    in
1      2    i1
.      .    .
.      .    .
.      .    .
2      1    i1
2      2    i2
问题是并不是所有的记录都存在。例如,可能缺少第1行和第2行i1

我想做的是,在不获取所有行并遍历它们的情况下,从查询中查看是否缺少任何行,我不关心其中一行,仅当缺少一行时

对于更复杂的问题,这是一个非常简单的例子,所以如果我没有清楚地揭示它,或者我忘记提到任何东西,请随时询问细节

PHP中的select和process是可以接受的,只要我不选择表中的所有内容,尽管我不知道如何通过处理数据而不选择all来做到这一点,但我觉得值得一提

你们中的一些人要求一个模式,所以…:


让我们再简化一些。。。假设第一列有一个可能的数据数组,可以在那里找到,第二列也是如此,第三列也是如此。应在表中找到其中3种之间的所有可能组合。我需要知道是否缺少任何查询…

这样的查询怎么样,这可能不是最好的性能,但对于一次性任务来说应该可以

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

假设您知道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中的行与实际行相匹配。缺少的行将在填充端显示为NULL。因此,我们可以通过在stuff表中选择任何具有空字段的行来获取所有缺少的行


编辑:您可以更改选择*。。。在最后一个查询中选择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 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

也可以很容易地进行修改,以便在将来需要时带回未找到的项目列表。

因此,您希望看到缺少6行?您是否有包含a、b和c的所有适用值的参考表?您或计算机如何知道是否缺少一行?你基于什么数据或模式进行查询?@马克:是的,我知道它们可能的值。只有i1、i2等是随机的。我编辑的问题,也许我可以解释得更清楚。嗯。。。不完全是我想要的,但伯爵给出了正确的想法。我知道所有可能的价值观。。。求和,选择全部并比较结果。如果有遗漏,结果将不同。酷。我不知道你到底想做什么。但我很高兴我的想法有帮助;