【问题标题】:MS Access sql query for forum tables论坛表的 MS Access sql 查询
【发布时间】:2010-11-21 18:27:58
【问题描述】:

如果你觉得这个问题对论坛来说很简单 - 把它归咎于我,我会道歉,因为我只是这个问题的新手。

我在 MS Access 中有这两个表:

通过 Comments.parent ID = Items.ID 连接的表 Items 和表 Comments。

我需要一个查询来显示 Items 表中的最后 10 条记录,每条记录包含

物品.id
项目.title
项目文本
项目,修改日期
项目的评论数 [如果有的话]
最后评论[如果有的话] 客人姓名
最后评论[如果有的话] date_modified

到目前为止,我得到了这样的东西:

选择前 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 commentscount 从项目 ,( SELECT t2.id as commentID, t2.guestName , t2.modified, t2.parentid FROM Comments as t2 ORDER BY t2.modified DESC ) as t3 在哪里 (Items.id = t2.parentid AND t3.commentID = (SELECT max(id) FROM Comments where parentid = Items.id)) ORDER BY Items.modified DESC 联盟 SELECT Items.id AS item_id, Items.* , null AS guestName, null AS comment_date, (SELECT count(*) FROM Comments where parentid = Items.id) as commentscount 从项目 WHERE (SELECT count(*) FROM Comments where parentid = Items.id) = 0 ) 作为 t4

嗯。它正在工作,但我一直在问自己是否可以以更简单的方式完成。

欢迎提出任何建议。

提前谢谢你。

【问题讨论】:

  • Flinsch 和 Remou,非常感谢您的反应。我不得不做一些小的调整,但你发送的一般想法对我都很有用。这两个例子都让我朝着正确的方向前进,以提高我的 sql 知识,并且我的查询工作顺利。

标签: ms-access


【解决方案1】:
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 语句,但我不确定。

(我没有测试过。)

【讨论】:

  • 谢谢弗林施。我的示例是这样工作的:SELECT TOP 10 Items.id, Items.title,Items.text,Items.modified, COUNT(Comments.id) AS count_of_cmets, (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.parentid = Items.id GROUP BY Items.id ORDER BY Items.modified DESC
【解决方案2】:

关于以下几行的东西怎么样:

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

【讨论】:

  • 谢谢Remou。我的示例是这样工作的:SELECT TOP 10 Items.id, Items.titel, Items.text, Items.modified, c.cmetsCOUNT, c.guest, c.commentDATE FROM Items LEFT JOIN ( SELECT parentId, Count(parentid ) AS cmetsCOUNT , LAST(guestName) AS guest, LAST(modified) AS commentDATE, LAST(Text) FROM Comments GROUP BY ParentID ORDER BY LAST(modified) DESC ) c ON Items.Id=c.ParentId ORDER BY items.modified DESC
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2010-10-30
  • 1970-01-01
  • 2021-08-15
  • 2013-10-26
相关资源
最近更新 更多