MYSQL Concat 几行并连接几张表

Posted

技术标签:

【中文标题】MYSQL Concat 几行并连接几张表【英文标题】:MYSQL Concat several rows and join several tables 【发布时间】:2017-08-01 12:02:48 【问题描述】:

我有以下表结构:

 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

有什么办法吗?

【问题讨论】:

【参考方案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。

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

【讨论】:

以上是关于MYSQL Concat 几行并连接几张表的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之concat的用法

mysql备份数据库时怎样只备份一个数据库中的其中几张表的数据,覆盖时只覆盖这几张表的内容

mysql游标中使用临时表

在mysql存储过程中使用concat创建json

在 php codeigniter 中使用 join/concat 的 mysql 查询结果

mysql 存储过程中使用游标中使用临时表可以替代数组效果