在具有相同id的select查询中组合两行

时间:2014-10-07 03:33:59

标签: mysql sql

我有这个查询

SELECT 
`sys_forms`.`FormID`,
`sys_forms`.`FormName`,
`sys_forms`.`FormCIPath`,
`sys_forms_in_groups`.`IsMenuLink`,
`sys_forms_in_groups`.`GroupID`

FROM (`sys_forms`) INNER JOIN `sys_forms_in_groups` 
ON `sys_forms_in_groups`.`FormID` = `sys_forms`.`FormID` WHERE `GroupID` = 1
UNION
SELECT 
`sys_forms`.`FormID`,
`sys_forms`.`FormName`,
`sys_forms`.`FormCIPath`,
`sys_forms_in_groups`.`IsMenuLink`,
`sys_forms_in_groups`.`GroupID`

FROM (`sys_forms`) INNER JOIN `sys_forms_in_groups` 
ON `sys_forms_in_groups`.`FormID` = `sys_forms`.`FormID` WHERE `GroupID` = 2

它将以下数据返回给我。

enter image description here

如您所见,有两个相同的FormID

我想要的是,如果ID相同,那么行应该合并,但GroupID对于相同的FormID都是不同的。

所以我希望他们以CSV格式加入,以便结果是

FormID FormName        -  -   GroupID
-------------------------------------------------
48     FormsIn Groups  -  -    1,2          

2 个答案:

答案 0 :(得分:2)

您的第一个查询可以写成:

SELECT sf.`FormID`, sf.`FormName`, sf.`FormCIPath`, sfig.`IsMenuLink`, sfig.`GroupID`
FROM `sys_forms` sf INNER JOIN
     `sys_forms_in_groups` sfig
     ON sfig.`FormID` = sf.`FormID`
WHERE `GroupID` IN (1, 2);

请注意使用表别名和单where子句与in

要获得所需内容,请使用group by并仅包含所需的列:

SELECT sf.`FormID`, sf.`FormName`, 
       group_concat(sfig.`GroupID`) as groupids
FROM `sys_forms` sf INNER JOIN
     `sys_forms_in_groups` sfig
     ON sfig.`FormID` = sf.`FormID`
WHERE `GroupID` IN (1, 2)
GROUP BY sf.`FormID`, sf.`FormName`, sf.`FormCIPath`, sfig.`IsMenuLink`;

答案 1 :(得分:2)

可以使用如下查询返回指定的结果:

SELECT f.FormID
     , f.FormName
     , f.FormCIPath
     , MAX(g.IsMenuLink) AS IsMenuLink
     , GROUP_CONCAT(DISTINCT g.GroupID ORDER BY g.GroupID) AS GroupIDs
  FROM `sys_forms` f 
  JOIN `sys_forms_in_groups` g
    ON g.FormID = f.FormID
   AND g.GroupID IN (1,2)
 GROUP BY f.formID

GROUP_CONCAT聚合将多个值组合成逗号分隔列表。 (可以指定不同的分隔符,默认为逗号。)

我们在MAX列周围使用IsMenuLink聚合,因此我们得到一个非NULL值来代替NULL。