Sql内连接正在生成重复的行

时间:2015-10-15 09:18:20

标签: php mysql sql inner-join

我正在尝试使用内部联接进行查询但不起作用。它显示多个重复的行。问题是我试图通过使用外键来做到这一点。但我无法解决它。 这是第一张表

@OneToOne(cascade=CascadeType.ALL)  
@PrimaryKeyJoinColumn  
private T1 t1;

第二个表

document_details

id inv_no bill_desc             bill_amount
 1 201501 test bill                    1000
 2 201501 test bill2                   1110
 3 201502 C&F Association Fee            50
 4 201502 Duty/Vat& Scanning           3620
 5 201502 Agent Charges                1750
 6 201502 Noc Charges                  1775
 7 201502 CPA Charges                  3572
 8 201502 Hi-Star Charges              1800
 9 201502 Exam. Miscellanies           5500
10 201502 Import Miscellanies          5000
11 201502 Commission@0.07%             7272

我正在尝试运行以下sql

bill_details

id inv_no doc_title            doc_desc
 1 201501 test                 test details
 2 201501 test2                test2
11 201502                      
10 201502                      
 9 201502  Doc. Recvd:26.08.15 Delivery:22.09.2015
 8 201502  Consignmnt:07Plts   Printing Chemical
 7 201502  C&F$:129896.67      BD.Tk.10388594.28
 6 201502  Inv. No:330955      Date:20.07.2015
 5 201502  L/C: 100315050139   Date:07.07.2015
 4 201502  BL No:WPG0026958    Date:01.08.2015
 3:201502  B/E No:C-992168     Date:17.09.2015

我得到以下输出 enter image description here

但我不想要这个输出。我不明白如何解决它显示如下输出 enter image description here

1 个答案:

答案 0 :(得分:0)

您想要实现的目标通常不是DBMS的任务,而是表示层,即用编程语言编写的GUI程序,例如以网格显示数据。

可以通过为每个发票创建行号并使用文档#1加入发票的帐单#1,使用文档#2加入帐单#2等来完成。

所以

id inv_no bill_desc             bill_amount  row_number
 1 201501 test bill                    1000  #1
 2 201501 test bill2                   1110  #2
 3 201502 C&F Association Fee            50  #1

id inv_no doc_title  doc_desc      row_number
 1 201501 test       test Details  #1
 2 201501 test2      test2         #2
11 201502                          #1

会给你

inv_no bill_desc             bill_amount  doc_title  doc_desc    
201501 test bill                    1000  test       test Details
201501 test bill2                   1110  test2      test2       
201502 C&F Association Fee            50                         

您使用完全外部联接,因为您可以拥有比文档更多的帐单,反之亦然。这通常不是一个非常复杂的查询,但是由于缺少row_number()和完全外连接而在MySQL中。

那么一个简单的查询怎么样,每个inv_no只给你一行:

inv_no  bill_descs             bill_amount  doc_titles  doc_descs
201501  test bill,test bill2   2110         test,test2  test Details,test2
...

您可以通过按inv_no聚合数据来实现此目的:

select 
  bill.inv_no, bill.bill_descs, bill.bill_amount, doc.doc_titles, doc.doc_descs
from 
(
  select 
    inv_no, 
    group_concat(bill_desc) as bill_descs,
    sum(bill_amount) as bill_amount
  from bill_details 
  group by inv_no
) bill
join
(
  select 
    inv_no, 
    group_concat(doc_title) as doc_titles,
    group_concat(doc_desc) as doc_descs
  from invoicedocument_details
  group by inv_no
) doc on doc.inv_no = bill.inv_no;