多行上的MySql Group_concat

时间:2016-09-13 10:57:46

标签: mysql sql visual-studio

我正在尝试将GROUP_CONCAT用于查询中的多行,而不是将所有记录合并为一行。

我有3张桌子:

CREATE TABLE `StockItems` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `Item` varchar(255) NOT NULL,
 `SubCatID` int(11) NOT NULL,
 `Qty` decimal(18,5) DEFAULT '0.00000',
 `SupplierID` int(11) NOT NULL,
 `PackPrice` decimal(19,4) NOT NULL,
 `QtyInPack` int(11) NOT NULL,
 `IndvPrice` decimal(19,4) DEFAULT NULL,
 `GroupID` int(11) NOT NULL,
 `Ref` varchar(255) NOT NULL DEFAULT '',
 `Del` tinyint(1) NOT NULL DEFAULT '0',
 `Size` int(11) DEFAULT NULL,
 `Fabed` tinyint(1) NOT NULL DEFAULT '0',
 `Def` tinyint(1) NOT NULL DEFAULT '1',
 `PorpDef` tinyint(4) NOT NULL DEFAULT '2',
 PRIMARY KEY (`ID`),
 KEY `SubCatID` (`SubCatID`),
 KEY `GroupID` (`GroupID`)
) ENGINE=MyISAM AUTO_INCREMENT=473 DEFAULT CHARSET=utf8;

CREATE TABLE `MTO` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `ProjID` int(11) DEFAULT NULL,
 `ItemID` int(11) DEFAULT NULL,
 `Size` int(11) DEFAULT NULL,
 `TotalFabs` decimal(11,5) DEFAULT NULL,
 `ActualFabs` decimal(10,3) NOT NULL,
 `ProjectedFabs` decimal(10,3) NOT NULL,
 `TotalTO` decimal(11,5) DEFAULT NULL,
 `ItemName` varchar(255) DEFAULT NULL,
 `TotalTS` decimal(11,5) DEFAULT NULL,
 `GroupID` int(11) DEFAULT NULL,
 `Fabed` int(11) NOT NULL DEFAULT '0',
 `SiteOrFab` tinyint(4) NOT NULL,
 `PiecePrice` decimal(8,2) NOT NULL DEFAULT '0.00',
 `PorP` int(11) NOT NULL,
 `Fin` tinyint(4) DEFAULT '0',
 PRIMARY KEY (`ID`),
 KEY `ItemID` (`ItemID`),
 KEY `ProjID` (`ProjID`)
) ENGINE=MyISAM AUTO_INCREMENT=574 DEFAULT CHARSET=utf8;

CREATE TABLE `Suppliers` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `Supplier` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

Suppliers Table:
    ID    |   Supplier
------------------------
    1     |   Akatherm
    2     |   Ebero

这是我正在尝试修改的查询:(这有效)

SELECT a.ID, 
       a.ItemID, 
       IF( a.Size IS NOT NULL , CONCAT( a.ItemName,  ' (', a.Size,  'm Length)' ) , a.ItemName ) AS ItemName, 
       ConvPorp(a.TotalFabs,a.ItemID,a.PorP) AS TotalFabs, 
       a.GroupID, 
       ConvPorp(a.ActualFabs,a.ItemID,a.PorP) AS ActualFabs, 
       ConvPorp(a.ProjectedFabs,a.ItemID,a.PorP) AS ProjectedFabs, 
       a.Size, 
       a.Fabed, 
       a.PorP, 
       b.QtyInPack, 
       b.SupplierID, 
       b.SubCatID, 
       a.Fin, 
       ConvPorp(b.Qty,a.ItemID,a.PorP) AS Qty, 
       GetResStock(a.ItemID) As ResStock
FROM MTO a 
JOIN StockItems b ON a.ItemID = b.ID 
WHERE SiteOrFab=1 
AND projid = 53 
ORDER BY a.Fabed, b.GroupID, b.SubCatID, a.Size, a.ItemName+0, a.ItemName

所以我要做的是在这个查询的末尾有一个GROUP_CONCAT,对于每个记录,它连接给定记录的GroupID中存在的供应商列表。

这是我想要的结果:(这也是上面工作查询的结果,减去最后一列):

ID     | ItemID| ItemName                 | TotalFabs | GroupID | ActualFabs| ProjecFabs| Size | Fabed | PorP | QtyInPack| SupplierID | SubCatID | Fin  | Qty     | ResStock ||  GROUP_CONCAT(SupplierID, SEPARATOR ',')
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
560    | 3     | 63mm Pipe (5m Length)    | 10.4000   | 3       | 0.0000    | 0.0000    | 5    | 0     | 2    | 1        | 1          | 1        | 0    | 0.0000  | 12.4000  ||   1,2,4,4
566    | 45    | 63mm Pipe (12m Length)   | 0.7500    | 3       | 0.0000    | 0.0000    | 12   | 0     | 2    | 1        | 4          | 1        | 0    | 0.0000  | 0.9167   ||   1,2,4,4
562    | 4     | 75mm Pipe (5m Length)    | 1.0000    | 4       | 0.0000    | 0.0000    | 5    | 0     | 2    | 1        | 1          | 1        | 0    | 0.0000  | 1.8000   ||   1,2,4,4
564    | 32    | 75mm Pipe (6m Length)    | 1.5000    | 4       | 0.0000    | 0.0000    | 6    | 0     | 2    | 1        | 4          | 1        | 0    | 37.0000 | 1.8333   ||   1,2,4,4
572    | 33    | 90mm Pipe (6m Length)    | 1.6250    | 5       | 0.0000    | 0.0000    | 6    | 0     | 2    | 1        | 4          | 1        | 0    | 35.0000 | 0.0000   ||   1,2,4,4
571    | 50    | 160mm Pipe (12m Length)  | 3.0833    | 8       | 0.0000    | 0.0000    | 12   | 0     | 2    | 1        | 4          | 1        | 0    | 0.0000  | 0.0000   ||   1,2,4,4
573    | 37    | 200mm Pipe (6m Length)   | 6.0000    | 9       | 0.0000    | 0.0000    | 6    | 0     | 2    | 1        | 4          | 1        | 0    | 34.0000 | 0.0000   ||   1,2,4,3
568    | 209   | 160/63 Branch            | 24.0000   | 61      | 0.0000    | 0.0000    | NULL | 1     | 2    | 1        | 8          | 21       | 0    | 0.0000  | 0.0000   ||   1,2,5
569    | 211   | 160/90 Branch            | 13.0000   | 63      | 0.0000    | 0.0000    | NULL | 1     | 2    | 1        | 8          | 21       | 0    | 0.0000  | 0.0000   ||   1,2
570    | 212   | 200/63 Branch            | 36.0000   | 67      | 0.0000    | 0.0000    | NULL | 1     | 2    | 1        | 8          | 21       | 0    | 0.0000  | 0.0000   ||   1

注意:如果大小不同,项目组可以包含同一供应商的多个实例,因此GROUP_CONCAT(SupplierID)包含多个实例,其中对于某些记录,SupplierID = 4。

我已经设法在输入GroupID的单独查询中执行此操作:

SELECT GROUP_CONCAT(b.SupplierID SEPARATOR ','), 
       GROUP_CONCAT(c.Supplier SEPARATOR ','),
       GROUP_CONCAT(b.Size SEPARATOR ','), 
       GROUP_CONCAT(b.ID SEPARATOR ',') 
FROM StockItems b 
JOIN Suppliers c 
    ON b.SupplierID = c.ID AND b.GroupID=5

我正在努力寻找一种方法将其附加到我当前的查询

非常感谢任何支持!

1 个答案:

答案 0 :(得分:3)

我认为您只需要DISTINCT关键字:

GROUP_CONCAT(DISTINCT b.SupplierID SEPARATOR ',')