2017-09-15 61 views
0

我有兩張表invoice和invoice_has_items。當我加入這兩個表的,我從兩個表接收數據:如何用NULL替換重複值

1

這裏前三欄爲發票表。我想將這些重複的值替換爲0或者像這樣的null。

2

我的查詢是:

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

我怎樣才能做到這一點?

+0

你能發送你用來加入表的查詢嗎? – Manav

+0

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

+0

這不是SQL的工作,但它可以很容易地在客戶端代碼中完成(我猜可以在MySQL中使用子查詢和變量完成,但這是一個醜陋的解決方案)。但爲了使其工作,您應該按第一列和第四列排序。否則,數據庫不需要以任何特定的順序返回行,然後您的要求沒有意義。 – axiac

回答

0

您可以通過使用排名做到這一點,然後一個條件語句:

事情是這樣的:

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; 

的想法是排名您的初始查詢的輸出,然後更改基於輸出在等級上。在這種情況下,發票中的每個項目的排名都應該增加,並且在發票ID更改時重置。

該解決方案未經測試,因爲沒有給出ddl。