2010-11-21 106 views
0

如果你會發現這個問題對於論壇來說很簡單 - 將責任歸咎於我,我會道歉,因爲我不過是這個問題的新手。論壇表的MS Access sql查詢

我在MS訪問這兩個表:

表項和表評論由Comments.parent ID = Items.ID連接。

我需要將顯示最近10條記錄,從項目表的查詢,包含

Item.id 
Item.title 
Item.text 
Item,date_modified 
count of Comments [if any] for the Item 
last Comments[if any] guestName 
last Comments[if any] date_modified 

到目前爲止,我有這樣的事情每個記錄:

 
SELECT TOP 10 t4.id, t4.* FROM 
(
SELECT Items.id AS item_id , Items.*, t3.guestName , t3.modified AS comment_date 
,(SELECT count(*) FROM Comments where parentid = Items.id) as comentscount 
FROM Items 
,(SELECT t2.id as commentID, t2.guestName , t2.modified, t2.parentid FROM Comments as t2 ORDER BY t2.modified DESC ) as t3 
WHERE 
(Items.id = t2.parentid AND t3.commentID = (SELECT max(id) FROM Comments where parentid = Items.id)) 
ORDER BY Items.modified DESC 

UNION 

SELECT Items.id AS item_id, Items.* , null AS guestName, null AS comment_date, 
(SELECT count(*) FROM Comments where parentid = Items.id) as comentscount 
FROM Items 
WHERE (SELECT count(*) FROM Comments where parentid = Items.id) = 0 
) AS t4 

嘛。它正在工作,但我一直在問自己,如果這可以以更簡單的方式完成。

任何建議將更受歡迎。

預先感謝您。

+0

Flinsch和Remou,非常感謝你對你的反應。我必須做一些小的調整,但你發送的一般想法對我來說都非常有用。這兩個例子都讓我朝着正確的方向前進,以提高自己的SQL知識,並使查詢順利進行。 – novice17 2010-11-22 11:38:57

回答

0
SELECT TOP 10 
Item.id, 
Item.title, 
Item.text, 
Item.modified, 
COUNT(Comment.id) AS count_of_comments, 
(SELECT TOP 1 Comment.guest_name FROM Comment WHERE Comment.parentid = Item.id ORDER BY Comment.modified DESC) AS last_guest_name, 
MAX(Comment.modified) AS last_comment_date 
FROM Item 
LEFT JOIN Comment ON Comment.parentid = Item.id 
GROUP BY Item.id 
ORDER BY Item.modified DESC 

我不確定內部SELECT聲明是否也可以更適當地集成。也許我們也可以ORDER BY Comments.modified DESC,然後只是「選擇」guest_name拒絕嵌套的SELECT聲明,但我不確定。

(我沒有測試過。)

+0

謝謝Flinsch。我有你的例子是這樣工作的: SELECT TOP 10 Items.id,Items.title,Items.text,Items.modified, COUNT(Comments.id)AS count_of_comments, (SELECT TOP 1 Comments.guest_name FROM Comments WHERE Comments.parentid = Items.id ORDER BY Comment.modified DESC)AS last_guest_name, (SELECT TOP 1 Comments.modified FROM Comments WHERE Comments.parentid = Items.id ORDER BY Comments.modified DESC) AS last_comment_date FROM Items LEFT JOIN Comments on Comments.parentid = Items.id GROUP BY Items.id ORDER BY Items.modified DESC – novice17 2010-11-22 11:42:22

0

如何上線的東西:

SELECT TOP 10 
     Item.id, 
     Item.title, 
     Item.text, 
     Item.date_modified, 
     c.CommentCount, 
     c.LastComment, 
     c.LastGuestName, 
     c.LastModDate 
FROM Item 
LEFT JOIN 
(SELECT ParentID, 
     Count(ParentID) As CommentCount, 
     Last(Comment) As LastComment, 
     Last(guestName) As LastGuestName, 
     Last(date_modified) As LastModDate 
FROM Comments 
GROUP BY ParentID 
ORDER BY date_modified DESC) c 
ON Item.ItemID=c.ParentID 
ORDER BY item.date_modified 
+0

謝謝Remou。我有你的例子如下工作: SELECT TOP 10 Items.id, Items.titel, Items.text, Items.modified ,c.commentsCOUNT ,c.guest ,C。commentDATE 從裝備 LEFT JOIN (SELECT parentId的,計數(parentId的)AS commentsCOUNT,LAST(guest虛擬機名稱)作爲嘉賓,LAST(修改)AS commentDATE,LAST(文本) 自評 GROUP BY PARENTID ORDER BY LAST(修改)DESC)c ON Items.Id = c.ParentId ORDER BY items.modified DESC – novice17 2010-11-22 11:43:37