2016-09-13 205 views
0

我想在我的查询中使用GROUP_CONCAT多行,没有将所有记录合并到1行。多行MySql 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。

我已成功地做到这一点在一个单独的查询,其中群ID输入:

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 

我只是在努力寻找一种方法来追加该到我当前的查询

任何支持不胜感激!

+0

你将需要找出哪些列(S)将用于'GROUP BY',你可能要加入一个中间返回到您当前的查询。 –

回答

3

我觉得你只是想DISTINCT关键字:

GROUP_CONCAT(DISTINCT b.SupplierID SEPARATOR ',') 
+0

我在另一个线程上发现了这个解决方案,它不会做我需要的东西,它仍然只返回1行。如果我添加一个Group By,它只返回MTO表中的SupplierID,并非所有可能的SupplierID的 –

+0

我想我只是将查询放入一个函数中并从主查询中调用它,这应该工作,我认为并将要简单得多,谢谢! –