MySQL販売データベースに2つのテーブルがあります。
注文表:
CREATE TABLE salestest.`orders` (
`ID` int(11) unsigned NOT NULL auto_increment,
`OrderDate` datetime NOT NULL,
`CustomerID` int(11) unsigned NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `ID` (`ID`),
KEY `OrderDate` (`OrderDate`),
KEY `CustomerID` (`CustomerID`)
) ENGINE=InnoDB;
INSERT INTO salestest.orders VALUES
( 1, '2012-04-15', 1 ),
( 2, '2012-05-20', 1 ),
( 3, '2012-06-30', 1 );
OrderDetailsテーブル:
CREATE TABLE salestest.`OrderDetails` (
`ID` int(11) unsigned NOT NULL auto_increment,
`OrderID` int(11) unsigned NOT NULL,
`ProductID` int(11) unsigned NOT NULL,
`Price` double NOT NULL default '0',
PRIMARY KEY (`ID`),
UNIQUE KEY `ID` (`ID`),
KEY `OrderID` (`OrderID`),
KEY `ProductID` (`ProductID`),
CONSTRAINT `OrderID_fk` FOREIGN KEY (`OrderID`) REFERENCES `orders` (`ID`)
) ENGINE=InnoDB;
INSERT INTO salestest.OrderDetails VALUES
( 1, 1, 1, 2 ),
( 2, 1, 2, 15 ),
( 3, 1, 3, 22 ),
( 4, 2, 1, 3 ),
( 5, 2, 2, 17 ),
( 6, 2, 3, 23 ),
( 7, 2, 4, 40 ),
( 8, 3, 1, 4 ),
( 9, 3, 2, 20 );
次に、顧客ごとに、各製品を購入する最後の価格を選択する必要があります。
これを行う簡単な方法は、サブクエリを使用することです。
SELECT od2.CustomerID,od2.ProductID, od2.Price AS LastPrice, od2.OrderDate AS LastDate
FROM (SELECT o1.ID, o1.CustomerID, o1.OrderDate, od1.ProductID, od1.Price
FROM orders AS o1
LEFT JOIN OrderDetails as od1 ON o1.ID=od1.OrderID
ORDER BY OrderDate DESC) AS od2
GROUP BY CustomerID, ProductID
ORDER BY CustomerID, ProductID;
結果:
CustomerID ProductID LastPrice LastDate
1 1 4 2012-06-30 00:00:00
1 2 20 2012-06-30 00:00:00
1 3 23 2012-05-20 00:00:00
1 4 40 2012-05- 20 00:00:00
さて、質問です。サブクエリ、一時テーブル、またはビューを避けたい場合、どうすれば同じ結果を得ることができますか。結合のみを使用したいのです。このクエリは、はるかに大きなクエリのごく一部であり、サブクエリを使用することは非常に非効率的です。
私はこのクエリを試しました:
SELECT o1.CustomerID、od1.ProductID、od1.Price AS LastPrice、o1.OrderDate AS LastDate
FROM Orders AS o1 LEFT JOIN OrderDetails as od1 ON o1.ID = od1.OrderID
GROUP BY CustomerID、ProductID
ORDER BY CustomerID、ProductID;
しかし、それは異なる結果をもたらします:
CustomerID ProductID LastPrice LastDate
1 1 2 2012-04-15 00:00:00
1 2 15 2012-04-15 00:00:00
1 3 22 2012-04-15 00:00:00
1 4 40 2012-05- 20 00:00:00
ご覧のとおり、LastPriceとLastDateは正しくありません。アレンの提案も試しましたが、結果は次のとおりです。
CustomerID ProductID LastPrice LastDate
1 1 4 2012-06-30 00:00:00
1 2 20 2012-06-30 00:00:00
スペンサーの回答結果からの最初のクエリは、重複した製品です。
CustomerID ProductID LastPrice LastDate
1 3 22 2012-04-15 00:00:00
1 3 23 2012-05-20 00:00:00
1 4 40 2012-05-20 00:00:00
1 1 4 2012-06- 30 00:00:00
1 2 20 2012-06-30 00:00:00
他の答えはすべて、私が避けようとしているサブクエリを使用しています。
助言がありますか?