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

时间:2013-05-30 11:19:50

标签: php mysql sql

我有以下设置:

  • 包含abc列的表格。
  • 具有随机数量的项目(i1,i2,i3,... in)的数组。
  • 表包含

    之类的行
    1      1    i1
    1      1    i2
    .      .    .
    .      .    .
    .      .    .
    1      1    in
    1      2    i1
    .      .    .
    .      .    .
    .      .    .
    2      1    i1
    2      2    i2
    

事情是并非所有记录都在那里。例如,行1 2 i1可能缺失。

我想做什么,从查询(没有得到所有行并遍历它们)是看IF是否缺少任何行(我不关心女巫一,只有一个丢失)。

对于更为复杂的问题,这是一个非常简单的示例,所以如果我没有明确说明,或者我忘了提及任何可以随意询问细节的内容。

PHP中的select和process是可以接受的,只要我不选择表中的所有内容(虽然我没有看到如何通过处理数据而不选择所有内容但感觉值得一提)。

有些人问了一个模式......:

让我们简化一些......让我们说第一列有一个可以在那里找到的可能数据的数组,对于第2列是相同的,并且已经在第3列中说过它。应该找到3之间的所有可能组合在桌子上。我需要知道是否有任何遗漏...

5 个答案:

答案 0 :(得分:1)

假设您知道他对a和b列的值,您可以尝试以下方法:

select c, count (*) group by c;

这会告诉你每个值有多少条目。

i1  3
i2  0
in  3

然后你可以迭代那个结果,看看有什么遗漏

答案 1 :(得分:1)

假设我们有一个包含此数据的表格。

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。

答案 2 :(得分:1)

您可以通过简单的计数来完成此操作。预期行数是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

答案 3 :(得分:0)

这样的查询怎么样,这可能不是最好的表现,但对于一次性任务,这应该有效。

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

答案 4 :(得分:0)

我会考虑这样做,即使您的值列表中有重复项,它仍然可以正常工作。这样做会对结果字段进行任何循环(只返回一行,它会告诉您在表中找不到数组中有多少唯一行。

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

也可以非常轻松地修改,以便在将来恢复未找到的项目列表。