2017-09-15 3 views
0

Ich habe zwei Tabellen Rechnung und invoice_has_items. Als ich diese zwei Tabellen verbinden erhalte ich Daten aus beiden Tabellen:Wie wiederhole ich Werte mit NULL

1

hier ersten drei Spalten sind aus Rechnungstabelle. Ich möchte diese doppelten Werte auf 0 oder null wie folgt ersetzen.

2

Meine Frage ist:

SELECT inv.*,invHas.* 
FROM invoice inv,invoice_has_item invHas 
WHERE invHas.invoiceID=inv.id 

Wie kann ich das erreichen?

+0

Können Sie die Abfrage senden, die Sie verwenden, um den Tabellen beizutreten? – Manav

+0

SELECT inv. *, InvHas. * FROM Rechnung inv, invoice_has_item invHas WHERE invHas.invoiceID = inv.id; –

+0

Dies ist kein Job für SQL, aber es kann leicht im Client-Code getan werden (ich denke, dass es in MySQL mit Unterabfragen und Variablen getan werden kann, aber es ist eine hässliche Lösung). Aber damit es funktioniert, sollten Sie die Zeilen nach der ersten und wahrscheinlich nach der vierten Spalte sortieren. Andernfalls muss die Datenbank die Zeilen nicht in einer bestimmten Reihenfolge zurückgeben, und Ihre Anforderung ist dann nicht sinnvoll. – axiac

Antwort

0

Sie können dies erreichen, indem ein Ranking und anschließend eine bedingte Anweisung:

Etwas wie folgt aus:

SELECT IF(rank=0, invoice_id, '-') AS invoice_id, 
     invoice_item_id 
FROM 
    (SELECT inv.id AS invoice_id, 
      invHas.id AS invoice_item_id, 
      @rank:=CASE WHEN @invoice <> inv.id THEN 0 ELSE @rank+1 END AS rank, 
      @invoice:=inv.id AS clset 
    FROM invoice inv, 
      invoice_has_item invHas, 

     (SELECT @rank:= -1) r, 

     (SELECT @invoice:= -1) i 
    WHERE invHas.invoiceID=inv.id 
    order by inv.id, invoice_has_item.id 
    ) AS ranked; 

Die Idee ist, die Ausgabe Ihrer Erstabfrage Rang und dann die Ausgabe ändern basierend auf dem Rang. In diesem Fall sollte der Rang für jeden Artikel in der Rechnung erhöht und zurückgesetzt werden, wenn sich die Rechnungs-ID ändert.

Die Lösung wurde nicht getestet, da kein ddl angegeben ist.