2014-10-07 64 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`; 
相關問題