我有以下查詢:獲取從最新的記錄中加入
SELECT f.name, MAX(cmt.created_at) AS CommentDate, cmt.comment AS LastComment
FROM families f
LEFT JOIN comments cmt ON f.id = cmt.commentable_id
WHERE f.id =12212
我得到評論的最後日期,而是獲得最後一個註釋(根據該日),我得到的第一一。那個怎麼樣?
我有以下查詢:獲取從最新的記錄中加入
SELECT f.name, MAX(cmt.created_at) AS CommentDate, cmt.comment AS LastComment
FROM families f
LEFT JOIN comments cmt ON f.id = cmt.commentable_id
WHERE f.id =12212
我得到評論的最後日期,而是獲得最後一個註釋(根據該日),我得到的第一一。那個怎麼樣?
試試這個方法:
SELECT f.name, cmt.created_at AS CommentDate, cmt.comment AS LastComment
FROM families f
LEFT JOIN comments cmt ON f.id = cmt.commentable_id
WHERE f.id =12212
and cmt.created_at = (
SELECT MAX(cmt.created_at)
FROM families f
LEFT JOIN comments cmt ON f.id = cmt.commentable_id
WHERE f.id =12212
)
或
SELECT f.name, cmt.created_at AS CommentDate, cmt.comment AS LastComment
FROM families f
LEFT JOIN comments cmt ON f.id = cmt.commentable_id
WHERE f.id =12212
and cmt.created_at = (
SELECT MAX(created_at)
FROM comments
WHERE commentable_id =12212
)
2該表上的左連接非常昂貴,因爲該表中有400,000行。 – 2013-03-07 14:03:49
@NoamB。我增加了一個解決方案,只有1個連接。 – Parado 2013-03-07 14:11:24
假設你的SQL Server上:您的查詢不應該工作,因爲沒有分組。
我想你需要的是採取TOP(1)
訂購cmt.created_at DESC
後;
SELECT TOP (1) f.name, cmt.created_at AS CommentDate, cmt.comment AS LastComment
FROM families f
LEFT JOIN comments cmt ON f.id = cmt.commentable_id
WHERE f.id =12212
ORDER BY cmt.created_at DESC
對於MySQL我想你可以使用LIMIT
代替TOP
:
SELECT f.name, cmt.created_at AS CommentDate, cmt.comment AS LastComment
FROM families f
LEFT JOIN comments cmt ON f.id = cmt.commentable_id
WHERE f.id =12212
ORDER BY cmt.created_at DESC
LIMIT 1
這正是你的查詢要求:您選擇的名稱,最大評論日期則第一個被加入評論(在這種情況下,恰好是第一個)。您需要在其中放置額外的邏輯以獲得最新評論。
不同的SQL口味有這樣做的不同的方法,但下面應該到處工作:
select f.name,
cmt.created_at as CommentDate,
cmt.comment as LastComment
from families f
left join comments cmt
on cmt.commentable_id = f.id
left join comments latest_cmt
on latest_cmt.commentable_id = f.id
and latest_cmt.created_at > cmt.created_at
where f.id = 12212
and latest_cmt.id is null;
我們假設評語表有一個id
字段作爲主鍵。
2該表上的左連接非常昂貴,因爲該表中有400,000行。 – 2013-03-07 14:02:59
除了「排序和選擇頂級」技巧之外,您無法解決此問題:您顯然必須加入評論,但是您需要確定最新的邏輯。你可以通過再次連接來完成,就像我有的一樣,或者使用子查詢;最終,RDBMS將做同樣的工作。如果你在'comment'表中有適當的索引,那麼開銷不應該太差。 *如果事實證明是這樣,那麼你需要改變你的模式,以便你的應用程序明確地標記出最新的評論,但這不會免費,會產生維護負擔。 – Xophmeister 2013-03-07 14:21:24
你是什麼意思 – DevelopmentIsMyPassion 2013-03-07 13:17:09