【问题标题】:Merge and UNION records from two tables using JOIN使用 JOIN 合并和合并两个表中的记录
【发布时间】:2014-11-28 21:52:17
【问题描述】:

如何使用JOIN 合并两个表中的记录和UNION。例如,假设我有以下表 A 和 B,并希望最终像表 C 一样。

我想提取并合并与tableA.Customer ID 匹配的所有tableB.Item ID,如果有多个匹配项,那么我想创建一个包含另一个匹配项的新字段。

//表A

  Customer ID     Customer_Bill_Name.......                  
    XXX001           XXX Company Name......           
    XXX002           YYY Company Name......         

//表B

 Customer ID          Item ID 1           
     XXX001            WH15 02
     XXX001            600278        
     XX0002            600000      

//表C:我想这样结束

  Customer ID     Customer_Bill_Name       Item ID 1            Item ID 2           
    XXX001         XXX Company Name         WH15 02             600278 
    XX0002         YYY Company Name         600000  

这是我使用JOIN合并记录的SQL代码

       $result = mysqli_query($con,"SELECT Customers.CustomerId,   
              Customers.Customer_Bill_Name, 
              Customers.WhichShipVia, 
              JrnlHdr.INV_POSOOrderNumber, 
              JrnlHdr.ShipByDate, 
              JrnlHdr.GoodThruDate, 
              JrnlHdr.CustomerSONo, 
              JrnlHdr.Reference, 
              JrnlHdr.TransactionDate, 
              JrnlRow.DistNumber, 
              JrnlRow.Quantity, 
              LineItem.ItemID, 
              LineItem.SalesDescription, 
              LineItem.PartNumber,
              LineItem.ItemDescription 
    FROM   Customers
    INNER JOIN JrnlHdr
    ON Customers.CustomerRecordNumber = JrnlHdr.CustVendId
    LEFT OUTER JOIN Address
    ON Customers.CustomerRecordNumber = Address.CustomerRecordNumber
    INNER JOIN JrnlRow // store sales order information
    ON JrnlHdr.PostOrder = JrnlRow.PostOrder
    LEFT OUTER JOIN BOMItems  // stores Bill of Materials attached to the sales order
    ON JrnlRow.ItemRecordNumber = BOMItems.AssemblyRecordNo
    INNER JOIN LineItem //Stores all Inventory Items
    ON JrnlRow.ItemRecordNumber = LineItem.ItemRecordNumber

   WHERE  JrnlHdr.JrnlKey_Journal = 11 
          AND JrnlHdr.PostOrder = JrnlRow.PostOrder 
          AND JrnlHdr.CustVendId = Customers.CustomerRecordNumber 
          AND JrnlRow.ItemRecordNumber = LineItem.ItemRecordNumber 
          AND JrnlHdr.POSOisClosed = 0 
          AND JrnlHdr.TransactionDate = '2014-11-17' 
  ORDER  BY JrnlHdr.Reference,JrnlRow.DistNumber");

【问题讨论】:

  • 这是一个pivot查询,mysql不支持。变通方法变得丑陋非常很快,而且由于你基本上有无限数量的可能列,我强烈建议你做一个正常的连接然后做行->客户端代码中的列转换。

标签: mysql join inner-join sql


【解决方案1】:

也许您可以使用group_concat,这会将所有值连接到一列。

select a.*, group_concat(b.ItemId) joined
from tableA a inner join tableB b on a.customerId = b.customerId
group by a.customerId, a.customer, a.company

结果:

CUSTOMERID  CUSTOMER    COMPANY         JOINED
XXX001      XXX         Company Name    600278,WH15 02
XXX002      YYY         Company Name    600000

SQL Fiddle example

【讨论】:

  • 如何将group_concat转换为数组或分解个体?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 2016-08-14
  • 2016-02-11
  • 1970-01-01
  • 2018-12-24
相关资源
最近更新 更多