Поиск / поиск пропущенных значений в MySQL - PullRequest
1 голос
/ 04 января 2011

Я использую MySQL и у меня есть таблица с именем sales.Его первичный ключ - sales_id.

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

1  |  147 
2  |  148
3  |  150

. Для sales_id 3 invoice_id должен быть 149. Я хочу знать, какие цифры отсутствуют в invoice_id.Я начинаю invoice_id с 147 и заканчиваю invoice_id с 4497. invoice_id не имел отношения к sales_id.

Можно ли узнать, какие числа отсутствуют в invoice_id, используя запрос?

Ответы [ 5 ]

2 голосов
/ 04 января 2011

Я предполагаю, что у вас есть таблица счетов - фактур.Вы можете попробовать:

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

РЕДАКТИРОВАТЬ: Если у вас нет таблицы СЧЕТОВ, вам может потребоваться вынуть все счета-фактуры, прежде чем проверять, есть ли пробел.ОТ ПРОДАЖ ПО ЗАКАЗУ invoice_id ASC ВЫБРАТЬ МАКС. (Invoice_id) ОТ ПРОДАЖ

затем по php:

for ($i = 1; $i < $max_invoice_id; $i++)
{
  if (!in_array($i, $all_invoice_id))
  {
    $gapId[] = $i;
  }
}
0 голосов
/ 28 июня 2012

Поскольку вы ищете 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);
0 голосов
/ 04 января 2011

Вы можете найти разрывы в последовательности 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.

0 голосов
/ 04 января 2011

Если вы просто пытаетесь найти числа вне последовательности в приведенном вами примере, вы можете использовать что-то вроде этого:

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

Если вы можете предоставить больший выборочный набор, мы могли бы найти лучший ответ для вас.

0 голосов
/ 04 января 2011
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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...