2014-10-07 67 views
1

我有这个疑问在选择查询合并两行有相同的ID

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

指定的结果可以查询返回的是这样的:

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汇总会将多个值组合成逗号分隔列表。 (可以指定不同的分隔符,默认值为逗号。)

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

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`; 
相关问题