2017-09-15 60 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。