在MySQL中查找/搜索缺失值

时间:2011-01-04 04:35:51

标签: php mysql database

我正在使用MySQL并有一个名为sales的表。它的主键是sales_id

-------------------------------------
sales_id | invoice_id | 
-------------------------------------

1  |  147 
2  |  148
3  |  150

对于sales_id 3,invoice_id应该是149.我想知道invoice_id中缺少哪些数字。我在147开始invoice_id,在4497结束invoice_idinvoice_idsales_id无关。

是否可以使用查询知道invoice_id中缺少哪些数字?

5 个答案:

答案 0 :(得分:2)

我认为你有一张发票表 - 发票。你可以尝试:

 SELECT invoice_id FROM INVOICES invoice
 WHERE NOT EXISTS (SELECT * FROM SALES s WHERE invoice.invoice_id = s.invoice_id)

编辑:如果您没有INVOICES表,您可能需要先检查所有发票,然后再检查是否存在差距。

SELECT DISTINCT invoice_id FROM SALES ORDER BY invoice_id ASC    SELECT MAX(invoice_id)FROM SALES

然后,通过php:

for ($i = 1; $i < $max_invoice_id; $i++)
{
  if (!in_array($i, $all_invoice_id))
  {
    $gapId[] = $i;
  }
}

答案 1 :(得分:0)

set @suggest_invoice:=147;

select 
  sales_id, 
  invoice_id,
  @suggest_invoice:=@suggest_invoice+1,
  if(invoice_id=@suggest_invoice, 0, 1) as missing_invoice
from sales
order by sales_id;

我猜你几乎得到的所有记录除了前两个记录missing_invoice=1

答案 2 :(得分:0)

如果您只是想在您提供的示例中找到序列中的数字,您可以使用以下内容:

SELECT *
FROM  `sales` 
WHERE (
`invoice_id` - 147 - `sales_id`
) = 0

如果您可以提供更大的样本集,我们可以为您提供更好的答案。

答案 3 :(得分:0)

当您搜索invoice_id时,请确保您在该列上有索引。否则查询会很慢。

您可以尝试以下代码

$inv_ids=range(147,4497);
$str_inv_ids=implode(",",$inv_ids);
$query="SELECT DISTINCT invoice_id FROM sales WHERE invoice_id IN ($str_inv_ids)";
$result=mysql_query($query);

while ($row = mysql_fetch_assoc($result)) {
    $inv_ids_db[]=$row['invoice_id'];
}
// It gives invoice Ids that are in $inv_ids but not in $inv_ids_db
$missing= array_diff($inv_ids,$inv_ids_db); 

print_r($missing);

答案 4 :(得分:-1)

您可以使用此查询在MySQL序列中找到空白:

SELECT invoice_id+1
   FROM sales s
   WHERE NOT EXISTS (
       SELECT NULL
       FROM sales t
       WHERE s.invoice_id = t.invoice_id+1
   ) 
   HAVING `invoice_id+1` < (SELECT MAX(invoice_id) FROM sales)
   ORDER BY invoice_id

这将返回序列中缺少的所有invoice_id,无论sales_id