2013-03-07 47 views
2

我有以下查詢:獲取從最新的記錄中加入

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 

我得到評論的最後日期,而是獲得最後一個註釋(根據該日),我得到的第一一。那個怎麼樣?

+0

你是什麼意思 – DevelopmentIsMyPassion 2013-03-07 13:17:09

回答

1

試試這個方法:

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 
        ) 
+0

2該表上的左連接非常昂貴,因爲該表中有400,000行。 – 2013-03-07 14:03:49

+0

@NoamB。我增加了一個解決方案,只有1個連接。 – Parado 2013-03-07 14:11:24

1

假設你的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 
+1

他最有可能不在SQL Server上,因爲他有'SELECT'上的列和聚合函數,但沒有'GROUP BY',這不會解析 – Lamak 2013-03-07 13:20:17

+0

@Lamak:是的,我只是更新了答案那。 – Kaf 2013-03-07 13:21:04

+0

我使用mysql所以... – 2013-03-07 13:22:21

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字段作爲主鍵。

+0

2該表上的左連接非常昂貴,因爲該表中有400,000行。 – 2013-03-07 14:02:59

+1

除了「排序和選擇頂級」技巧之外,您無法解決此問題:您顯然必須加入評論,但是您需要確定最新的邏輯。你可以通過再次連接來完成,就像我有的一樣,或者使用子查詢;最終,RDBMS將做同樣的工作。如果你在'comment'表中有適當的索引,那麼開銷不應該太差。 *如果事實證明是這樣,那麼你需要改變你的模式,以便你的應用程序明確地標記出最新的評論,但這不會免費,會產生維護負擔。 – Xophmeister 2013-03-07 14:21:24