簡體   English   中英

在具有相同ID的選擇查詢中合並兩行

[英]Combine two rows in select query having same id's

我有這個查詢

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

它返回我下面的數據。

在此處輸入圖片說明

如您所見,有兩個相同的FormID

我想要的是,如果id相同,則應合並行,但對於相同的FormID, GroupID不同。

所以我希望他們以CSV格式加入,這樣結果是

FormID FormName        -  -   GroupID
-------------------------------------------------
48     FormsIn Groups  -  -    1,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);

注意使用表別名和in的單個where子句。

要獲得所需的內容,請使用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`;

指定的結果可以通過如下查詢返回:

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM