2016-09-13 15 views
0

私はクエリ内の複数行に対してGROUP_CONCATを使用しようとしていますが、すべてのレコードを1行にマージする必要はありません。複数行のMySql Group_concat

私は3つのテーブルがあります。だから、私は何をしようとしていることGROUP_CONCATを持っている(これは動作します)

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 

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 

これは私が修正しようとしているクエリですがレコードごとに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

を、あなたは中間に参加する必要があります結果を現在のクエリに戻します。 –

答えて

3

は、私はあなただけDISTINCTキーワードたいと思う:あなたはGROUP BY` `に使用される列(複数可)を把握する必要があるとしている

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

私はこの解決策を別のスレッドで見つけましたが、必要な処理を実行しません。それでも1行しか返しません。グループを追加するとMTOテーブルのSupplierIDが返されますが、すべて可能なわけではありませんSupplierIDの –

+0

私は関数にクエリを入れてメインクエリから呼び出すと思いますとにかく、ずっと簡単ですね。 –