2009-10-21 26 views
0

我知道有很多「我如何找到最近記錄」的問題,但沒有一個解決了我的特殊問題:在MySQL中,我試圖查找映射到同一個表中兩個不同類別的條目的最新記錄。基本上有一個帶有一堆信息的ENTRIES表,一個CATEGORIES表(id,name)和一個ENTRY_CATEGORIES表(entry_id,category_id)。我需要找到映射到兩個不同類別的最新記錄。我已經設法做到了這一點,但只能通過本質上加入派生表來實現,並且感覺好像有一個更簡潔的方法來做到這一點。我怎樣才能更好地表達以下爛攤子:查找類別交叉點的最新條目

SELECT doc.entry_id 
FROM exp_category_posts doc 
INNER JOIN exp_category_posts fund ON doc.entry_id = fund.entry_id 
INNER JOIN exp_weblog_titles t ON doc.entry_id = t.entry_id 
WHERE doc.cat_id = 408 
AND fund.cat_id = 548 
AND t.entry_date = (SELECT MAX(t.entry_date) 
FROM exp_category_posts doc 
INNER JOIN exp_category_posts fund ON doc.entry_id = fund.entry_id 
INNER JOIN exp_weblog_titles t ON doc.entry_id = t.entry_id 
WHERE doc.cat_id = 408 
AND fund.cat_id = 548) 

這是一個硬編碼的例子,其中408和548通常會領域以及。如果你好奇,這是一個Expression Engine數據庫。

回答

1

你可以嘗試用替換

AND t.entry_date = (SELECT MAX(t.entry_date) 
FROM exp_category_posts doc 
INNER JOIN exp_category_posts fund ON doc.entry_id = fund.entry_id 
INNER JOIN exp_weblog_titles t ON doc.entry_id = t.entry_id 
WHERE doc.cat_id = 408 
AND fund.cat_id = 548) 

ORDER BY t.entry_date DESC 
LIMIT 1 

優化器將可能與最終的類似查詢結束(即不能保證,當然,但它是相當有可能的) ,但查詢只有一半的時間。您必須運行explain並分析幾個select查詢以查看它是否表現良好或更好。

+0

我很喜歡,但是這個版本的MySQL不允許在子查詢中使用LIMIT語句。應該提到那個,對不起。 – Tom 2009-10-21 22:26:50