mysql:具有连接表和值不具有唯一性的Group_concat

时间:2015-04-07 14:39:41

标签: mysql

我遇到一个问题,我需要将多行数据聚合并连接成单行输出。我理解表是一个问题,因为它们不是唯一索引,但我需要在查询级别而不是脚本级别执行此操作,我无法触及数据库结构。

我们走了:

表:特征

id          code_a       code_b
-------------------------------
2201         CHAU         AIRS
2201         CHAU         PELC
2201         PROX         AUTO
2201         PROX         HOP`

表:characteristics_types

code        description
-------------------------------
CHAU        Heating System
PROX        Nearby

表:characteristics_sub_types

code_a       code       description
-------------------------------
CHAU         AIRS         Forced Air
CHAU         PELC         Baseboard
PROX         AUTO         Highway
PROX         HOP          Hospital

需要的结果:

id      Heating System                 Nearby
--------------------------------------------------------
2201    Forced Air, Baseboard          Highway, Hospital

不工作:

SELECT id,
(case when C.code_a='CHAU' THEN GROUP_CONCAT(STC.description) ELSE NULL END) AS Heating System,
(case when C.code_a='PROX' THEN GROUP_CONCAT(STC.description) ELSE NULL END) AS Nearby

from characteristics C
        inner join characteristics_types TC on C.code_a=TC.`code`
        inner join characteristics_sub_types STC on C.code_a=STC.code_a and C.code_b=STC.`code`
            GROUP BY C.id,C.code_a

我得到以下结果:

id      Heating System                 Nearby
--------------------------------------------------------
2201    Forced Air, Baseboard         NULL
2201    NULL                          Highway, Hospital

任何方向都会非常感谢!

4 个答案:

答案 0 :(得分:0)

您可以尝试这种方式:

SELECT c.id,
GROUP_CONCAT(STC.description_heating) AS `Heating System`,
GROUP_CONCAT(STC.description_nearby)  AS Nearby

from characteristics C
        inner join characteristics_types TC on C.code_a=TC.`code`
        inner join (
           SELECT code_a, code,
              CASE WHEN code_a = 'CHAU' THEN description ELSE null END as descriptio_heating,
              CASE WHEN code_a = 'PROX' THEN description ELSE null END as descriptio_nearby,
           FROM characteristics_sub_types 
        ) as STC on C.code_a=STC.code_a and C.code_b=STC.`code`
GROUP BY C.id

答案 1 :(得分:0)

GROUP_CONCAT接受DISTINCT关键字,该关键字在粉丝输出查询中非常有用。如果您需要获得结果,也可以在ORDER BY内使用GROUP_CONCATSee Documentation。使用此功能,我们可以编写您想要的查询,如下所示:

SELECT 
  c.id,
  GROUP_CONCAT(DISTINCT ct.description) as 'Heating System',
  GROUP_CONCAT(DISTINCT cst.description) as 'Nearby'
FROM characteristics c 
  LEFT JOIN characteristics_types ct ON ct.id = c.id
  LEFT JOIN characteristics_sub_types cst 
    ON cst ON cst.code_a = c.code_a AND cst.code = c.code_b
GROUP BY 1

答案 2 :(得分:0)

我会编写单独的子查询,每个子查询都会预先形成您需要的group_concat,并将它们连接在一起。我个人就这样写了:

SELECT c.id, GROUP_CONCAT(cst.description) AS 'Heating System'
FROM characteristics c
JOIN characteristics_sub_types cst ON cst.code_a = c.code_a AND cst.code = c.code_b AND c.code_a = 'CHAU'
GROUP BY c.id;

这样的加入:

SELECT c.id, t1.`Heating System`, t2.`Nearby`
FROM(
  SELECT c.id, GROUP_CONCAT(cst.description) AS 'Heating System'
  FROM characteristics c
  JOIN characteristics_sub_types cst ON cst.code_a = c.code_a AND cst.code = c.code_b AND c.code_a = 'CHAU'
  GROUP BY c.id) t1
JOIN(
  SELECT c.id, GROUP_CONCAT(cst.description) AS 'Nearby'
  FROM characteristics c
  JOIN characteristics_sub_types cst ON cst.code_a = c.code_a AND cst.code = c.code_b AND c.code_a = 'PROX'
  GROUP BY c.id) t2 ON t1.id = t2.id;

这是一个有效的SQL Fiddle

答案 3 :(得分:0)

SELECT c.id,
GROUP_CONCAT(STC.description_heating) AS `Heating System`,
GROUP_CONCAT(STC.description_nearby)  AS Nearby

from characteristics C
    inner join characteristics_types TC on C.code_a=TC.`code`
    inner join (
       SELECT code_a, code,
          CASE WHEN code_a = 'CHAU' THEN description ELSE null END as description_heating,
          CASE WHEN code_a = 'PROX' THEN description ELSE null END as description_nearby
       FROM characteristics_sub_types 
    ) as STC on C.code_a=STC.code_a and C.code_b=STC.`code`
GROUP BY C.id