我有一個子查詢問題造成了糟糕的表現......我在想這個子查詢可以使用連接來重寫,但我很難將它包裹起來。表現不佳的Mysql子查詢 - 我可以把它變成一個Join嗎?
查詢的要點是這樣的: 對於EmailAddress和Product的給定組合,我需要得到一個不是最新的ID列表......這些命令將被標記爲「廢棄」 「在表中這將只留下了EmailAddress的和產品的AA給出的組合,最新的秩序......(這是否有意義?)
表定義
CREATE TABLE `sandbox`.`OrderHistoryTable` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`EmailAddress` VARCHAR(100) NOT NULL ,
`Product` VARCHAR(100) NOT NULL ,
`OrderDate` DATE NOT NULL ,
`rowlastupdated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY ( `id`) ,
KEY `EmailAddress` ( `EmailAddress`) ,
KEY `Product` ( `Product`) ,
KEY `OrderDate` ( `OrderDate`)
) ENGINE = MYISAM DEFAULT CHARSET = latin1;
查詢
SELECT id
FROM
OrderHistoryTable AS EMP1
WHERE
OrderDate not in
(
Select max(OrderDate)
FROM OrderHistoryTable AS EMP2
WHERE
EMP1.EmailAddress = EMP2.EmailAddress
AND EMP1.Product IN ('ProductA','ProductB','ProductC','ProductD')
AND EMP2.Product IN ('ProductA','ProductB','ProductC','ProductD')
)
重複 'in' 語句中的說明
13 [email protected] ProductA 2010-10-01
15 [email protected] ProductB 2010-20-02
46 [email protected] ProductD 2010-20-03
57 [email protected] ProductC 2010-20-04
158 [email protected] ProductE 2010-20-05
206 [email protected] ProductB 2010-20-06
501 [email protected] ProductZ 2010-20-07
我查詢的結果應該是 | 13 | | 15 | | 46 | | 57 |
這是因爲,在列出的訂單中,這4個已被相同類別產品的新訂單「取代」。此'類別'包含產品A,B,C & D.
訂單ID 158和501在其各自類別中根據查詢顯示沒有其他訂單。
基於以下關接受的答案的最終查詢: 我結束了使用下面的查詢,沒有子查詢,得到了約3倍的性能(從90秒30秒關閉)。我現在也有一個單獨的「組」表在那裏我可以枚舉,而不是在查詢本身拼寫出來小組成員...
SELECT DISTINCT id, EmailAddress FROM (
SELECT a.id, a.EmailAddress, a.OrderDate
FROM OrderHistoryTable a
INNER JOIN OrderHistoryTable b ON a.EmailAddress = b.EmailAddress
INNER JOIN groups g1 ON a.Product = g1.Product
INNER JOIN groups g2 ON b.Product = g2.Product
WHERE
g1.family = 'ProductGroupX'
AND g2.family = 'ProductGroupX'
GROUP BY a.id, a.OrderDate, b.OrderDate
HAVING a.OrderDate < MAX(b.OrderDate)
) dtX
仍然閱讀我的答案。我發表了一些評論。順便說一句,發佈解釋結果。大約有多少行? – Unreason 2010-11-01 15:27:23
目前有〜900,000行 – 2010-11-01 17:54:59