我正在使用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_id
。invoice_id
与sales_id
无关。
是否可以使用查询知道invoice_id中缺少哪些数字?
答案 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
。