【问题标题】:SQL Server Query - Retrieve list of articles and multiple comments per article for preview in single query?SQL Server 查询 - 检索文章列表和每篇文章的多个评论以在单个查询中预览?
【发布时间】:2014-01-22 21:51:56
【问题描述】:

...当查看某人墙上或您的新闻提要中的帖子列表时,就像 Facebook 的 cmets 预览一样。

我的数据库当前设置有一个表articles,主键为articleID

我有另一个表 comments,主键 commentID 和外键 articleID 指向相应的文章。

当我使用该文章的 cmets 检索一篇文章时,这是微不足道的,根本不会给我带来负担。但是,是否可以编写一个查询,将这两个表连接在一起并检索最近 10 篇文章的列表(用于构建预览)并说每篇文章 3 个 cmets(以创建 cmets 预览)?

我无法弄清楚这一点,希望有经验的意见。干杯,谢谢!


我没有回答我自己问题的声誉,所以我将在此处发布答案。感谢到目前为止的两位评论员。

哇,我以为我理解联接的方式令人震惊。事情的简单事实是我没有。我认为以一对多关系连接两个表只能在左表中每行返回一行。回想起来,这显然是错误的,因为会返回哪一行?鉴于当前的两个响应考虑了这个问题,我发现这两篇文章使用了这些 cmets 引导我的想法。因此,感谢您的帮助。

How can a LEFT OUTER JOIN return more records than exist in the left table?

Select first record in a One-to-Many relation using left join

用这样一个新手问题为任何偶然发现这个问题的人彻底回答这个问题......

文章表:

ArticleID----------ArticleName
100                  Art 1
200                  Art 2

评论表:

CommentID----------ArticleID-------Comments------Date
1                     100           test         date 1
2                     100           test2        date 2
3                     100           test3        date 3
4                     100           test4        date 4 

上面引用的第二篇文章真正解决了我的问题。就我而言,我真的需要这样的东西:

SELECT 
TOP 10 articles.*,
       comments.*
  FROM articles
  LEFT
  JOIN comments
    ON articles.articleID = comments.articleID
   AND comments.commentID =
        ( SELECT TOP 3
                 commentID
            FROM comments
           WHERE comments.articleID = articles.articleID
       )
;

【问题讨论】:

    标签: sql sql-server join foreign-keys


    【解决方案1】:

    将两者结合在一起的简单查询是

    select top 10 a.articleid, c.commentid, <other fields>
    from article a
    left join comments c on a.articleid = c.articleid
    order by <date> desc
    

    我正在使用左连接,这样您仍将返回没有任何 cmets 的记录。显然,您需要对查询做更多的工作才能真正让它返回您想要的值,但这应该是您可以使用的基础。

    如果您的示例中有更多信息,例如样本表信息,可以帮助我们为您提供更多反馈,例如如何返回前 10 名。

    【讨论】:

    • 非常感谢!这帮助我得到了我需要的完整答案!
    • 太棒了!很高兴能帮助你。您添加到帖子中的信息也绝对有助于了解您的问题以及您如何找到解决方案! :)
    【解决方案2】:

    考虑下面的文章表结构

    ArticleID----------ArticleName
    100                  Art 1
    200                  Art 2
    

    考虑下面的评论表结构

    CommentID----------ArticleID-------Comments------Date
    1                     100           test         date 1
    2                     100           test2        date 2
    3                     100           test3        date 3
    4                     100           test4        date 4
    

    试试这个查询

    SELECT TOP 3 A.ARTICLEID, C.COMMENTS FROM ARTICLE A
    LEFT JOIN COMMENTS C ON C.ARTICLEID = A.ARTICLEID WHERE A.ARTICLEID = 100
    ORDER BY C.DATE DESC
    

    如果这不是您想要的,请考虑改进您的问题。

    愉快的 SQLing....

    【讨论】:

    • 非常感谢!这帮助我得到了我需要的完整答案!
    猜你喜欢
    • 2020-12-20
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多