【问题标题】:MYSQL Concat several rows and join several tablesMYSQL Concat 几行并连接几张表
【发布时间】:2023-03-14 02:00:01
【问题描述】:

我有以下表结构:

 tMaster
 City   ClientId    ProductId   
 -------------------------------------
 1          1       1
 1          1       N
 2          1       1   
 2          2       3
 N          N       N

 tCity
 CityId   CityName      
 ----------------------
 1     City1   
 2     City2   
 N     CityN  

 tClient
 ClientId   ClientName      
 ----------------------
 1          ClientName1   
 2          ClientName2   
 N          ClientNameN  

 tProduct
 ProductId  ProductName
-------------------------------------
 1          ProductName1 
 2          ProductName2    
 3          ProductName3
 N          ProductNameN

我的 SQL 是:

 SELECT idCity, 
 GROUP_CONCAT(DISTINCT ClientId , "|" ,ProductId ORDER BY ClientId) AS StringResult
 FROM tMaster
 GROUP BY idCity
 ORDER BY idCity

所以,我的结果是:

 idCity StringResult
 ---------------------------------------------------------
 1      ClientId1|ProductId1,ClientIdN|ProductIdN
 2      ClientId1|ProductId1,ClientId2|ProductId3

但我需要从 tCity、tClient 和 tProduct 中获取 CityName、ClientName 和 ProductName

 idCity City    StringResult
 ---------------------------------------------------------
 1      City1   ClientId1|ClientName1|Product1|ProductName1,ClientN|ClientNameN|ProductIdN|ProductNameN
 2      City2   ClientId1|ClientName1|ProductId1|ProductName1,ClientId2|ClientName2|ProductId3|ProductName3

有什么办法吗?

【问题讨论】:

    标签: mysql group-by inner-join distinct group-concat


    【解决方案1】:

    您没有在 SELECT 语句中包含这些列,因此您不会在输出中得到这些列。试试这样的:

    SELECT idCity, CityName, ClientName, ProductName
    GROUP_CONCAT(
        DISTINCT tMaster.ClientId , "|" , CityName, "|", ClientName, "|", 
        ProductId , "|", ProductName ORDER BY tMaster.ClientId) AS StringResult
    FROM tMaster
    INNER JOIN tCity ON tMaster.city = tCity.CityId
    INNER JOIN tClient ON tMaster.ClientId = tClient.ClientId
    INNER JOIN tProduct ON tMaster.ProductId = tProduct.ProductId
    

    由于其中一些列名不明确,您需要包含表名,即 tMaster.ClientId。

    这应该可行。我需要设置一个快速架构来验证。

    【讨论】:

      猜你喜欢
      • 2016-05-09
      • 2012-12-27
      • 1970-01-01
      • 2015-12-16
      • 2013-01-20
      • 1970-01-01
      • 2020-07-24
      • 2017-07-25
      • 1970-01-01
      相关资源
      最近更新 更多