2011-01-04 17 views
1

Ich benutze MySQL und habe eine Tabelle mit dem Namen sales. Sein Primärschlüssel ist sales_id.Suchen/Suchen nach fehlenden Werten in MySQL

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

1 | 147 
2 | 148 
3 | 150 

Für sales_id 3 die invoice_id soll von invoice_id sein 149. Ich möchte wissen, welche Zahlen fehlen. Ich starte invoice_id bei 147 und Ende invoice_id bei 4497. Die invoice_id hatte keine Beziehung mit sales_id.

Kann man mithilfe einer Abfrage wissen, welche Nummern in invoice_id fehlen?

Antwort

2

Ich nehme an, dass Sie eine Rechnungstabelle haben - RECHNUNGEN. Sie können versuchen:

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

EDIT: Wenn Sie nicht die Rechnungen Tabelle haben, können Sie aus alle Rechnungen in Anspruch nehmen müssen, bevor überprüft, ob es eine Lücke ist.

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

dann durch php:

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

leider nein, ich Rechnungen genannt keine Tabelle haben, die invoice_id Umsatz aus einer Tabelle INVOICE_NUMBER genannt kommen. es enthält nur den größten Rechnungswert (oder den letzten Wert von invoice_id im Verkauf) – praveenmon

+0

@praveenmon: Ich habe die Antwort aktualisiert, bitte überprüfen Sie es. –

+0

@ HoàngLong, verwenden Sie nicht $ vor den Variablennamen in PHP? Kennen Sie PHP wirklich? – Imdad

0
set @suggest_invoice:=147; 

select 
    sales_id, 
    invoice_id, 
    @suggest_invoice:[email protected]_invoice+1, 
    if([email protected]_invoice, 0, 1) as missing_invoice 
from sales 
order by sales_id; 

Ich denke, Sie fast alle Datensätze mit Ausnahme der immer erste zwei mit missing_invoice=1

0

Wenn Sie nur versuchen, Zahlen aus der Sequenz in dem Beispiel zu finden, die Sie zur Verfügung gestellt haben, könnten Sie uns e etwas wie folgt aus:

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

Wenn Sie einen größeren Probensatz bieten, die wir für Sie Tool eine bessere Antwort fähig sein könnte.

+0

gut, aber es gibt keine Notwendigkeit, minus off sales_id – ajreal

-1

Sie können Lücken in einer MySQL-Sequenz finden Sie diese Abfrage mit:

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 

Dies alles invoice_id fehlt in der Folge zurück, und zwar unabhängig von sales_id.

+0

Diese Abfrage schlägt fehl, wenn 2 aufeinanderfolgende invoice_id fehlen – Imdad

0

Wenn Sie nach invoice_id suchen, stellen Sie sicher, dass Sie einen Index für diese Spalte haben. Andernfalls werden die Abfragen langsam sein.

können Sie versuchen, den folgenden Code

$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); 
Verwandte Themen