当前位置: 首页 > 面试题库 >

在一个查询中从三个表中获取数据

秦联
2023-03-14
问题内容

我正在尝试一次从三个表中检索数据。这些表如下所示:

类别

id
category
messageid

讯息

id
title
message

评论

id
messageid
message

我想要得到的是1条消息(因为我有一个WHERE基于id的子句3),3个类别(因为有3个类别链接到消息)和2条注释(因为有2条注释链接到消息)。

我正在尝试使用以下查询来检索数据:

SELECT categories.category, messages.id, messages.title, messages.message, comments.count, comments.id as commentid, comments.message as commentmessage
FROM categories
RIGHT JOIN 
  (SELECT id, title, message
  FROM messages WHERE messaged.id = 3) messages
ON messages.id = categories.messageid
LEFT JOIN
  (SELECT count(id), id, message
  FROM comments
  GROUP BY id, message) comments
ON messages.id = comments.messageid
ORDER BY article.id DESC

但是,当运行此查询时,我得到6个结果:

category      id  title      message      count  commentid  commentmessage
test          3   the title  the message  1      6          comment 1
test          3   the title  the message  1      5          comment 2
installation  3   the title  the message  1      6          comment 1
installation  3   the title  the message  1      5          comment 2
question      3   the title  the message  1      6          comment 1
question      3   the title  the message  1      5          comment 2

在我预期结果如下的地方:

category      id  title      message      count  commentid  commentmessage
test          3   the title  the message  1      6          comment 1
question      3   the title  the message  1      5          comment 2
installation  3   the title  the message  1      null       null

只有三行,我应该能够获取所有需要的数据。这有可能吗?我做错了吗??


问题答案:

如评论中所述,这里有几个问题。

首先,由于您要联接三个表,因此您得到的答案是正确的。1 x 2 x 3行= 6。

其次,您对评论的汇总实际上并没有汇总任何内容。正如您在结果中看到的那样,计数始终为1,而我希望您认为两个评论为2。由于您要对ID进行分组,因此将对每个唯一ID(始终为1)执行计数。我想您可能想对messageid进行分组

SELECT count(*), messageid
FROM comments
GROUP BY messageid

您将需要进行其他联接或单独的查询才能获取评论本身。

同样,正如评论中所讨论的那样,您通常不会以这种方式获取信息。您通常只需进行三个查询,因为其中两个关系是一对多的。如果类别很短(并且您正在使用SQL
Server),则可以将类别压缩到自己的列中(即“测试,安装,问题”)。这是您将如何做的。

select id, title, message,
       (select CAST(category + ', ' as nvarchar(max))
        from @Categories c where messageid = m.id
        for xml path('')) as Categories
from @Messages m
where m.id = 3

实际上,有几种方法可以做到这一点,但这既快速又肮脏。这样一来,您只需要对查询再进行一次查询即可。您可以加入上一个查询,并像这样在两行中获取所有信息

select m.id, title, m.message,
       (select CAST(category + ', ' as nvarchar(max))
        from @Categories c where messageid = m.id
        for xml path('')) as Categories,
        cm.message
from @Messages m
left outer join @Comments cm on m.id = cm.messageid
where m.id = 3

但同样,您可能只想再进行一次查询以避免重复信息。

最后,我想展示一下您可能希望如何进行评论计数。

select m.id, title, m.message,
       (select CAST(category + ', ' as nvarchar(max))
        from @Categories c where messageid = m.id
        for xml path('')) as Categories,
        CommentCount,
        cm.message
from @Messages m
left outer join 
(   
    select messageid, COUNT(*) CommentCount
    from @Comments 
    group by messageid
) rsCommentCount on rsCommentCount.messageid = m.id


 类似资料:
  • 我有用于分页的逻辑,它工作得非常好。这个问题是为了优化/改进我是如何做某事的。 我正在运行两个查询以获得结果集。第一个查询按限制和偏移量获取所有项,第二个查询获取总计数。我需要这个总数来计算表示层中的分页链接。 我想避免运行两个查询,如果可能的话,将它们合并成一个。 例如,如果数据库中有100项,并且我运行下面的查询时为1,为20,那么查询应该返回20个结果和100个计数。我目前在两个单独的查询中

  • 我试图从获取数据。总共有9个表格,我必须相应地从所有表格中显示产品列表。 我考虑过使用连接,并尝试了左连接,如下所示: 这里是主表,pid是从tbl2到tbl9的所有表的。 注意:这里我在所有表上使用了来避免长查询,但是在实际的数据库操作中,只提到特定的列来提高性能。 现在实际的问题是,我没有得到所有的记录从表使用左加入。只检索中对应的每个条目的最后一行。 我使用了GROUP BY来避免重复的左连

  • 问题内容: 我在MySQL中有两个表 现在,如果我想从邮件表中删除就可以了。但是,当我通过messageid删除消息时,该记录仍然存在于usersmessage上,我必须立即从这两个表中删除。 我使用以下查询: 然后我测试 但是这两个查询并没有完成此任务。 问题答案: 您不能用分号分隔它们吗? 要么 只需如下使用

  • 问题内容: K,所以我有两个表: 我想从类别中获取所有信息,并计算每个类别中的问题数(question_id)。 假设,第一个类别(计费)将有一个问题,第二个类别(安全)将有3个问题。 我已经试过了: 问题答案: 您想这样做: 在将确保没有问题类别获得与数= 0上市

  • 问题内容: 我下面有显示反社会犯罪总数的代码,但我也希望从另一个称为be output的表中获取代码。我试图找到一种解决方法,但无法使其正常工作。有任何想法吗? 问题答案: 您要用来查找位置名称。该查询可能看起来像这样: 您需要为和输入正确的列名称。

  • 我有两个表(休假,CompOff)我想以员工请求的形式向用户(前端)显示这些表数据。员工可以请求休假和compoff。两个表都有createdOn,empid列。我不知道如何获取两个表数据,然后返回一个包含两个表数据的列表。 离开桌子- 组合表- 在Springboot中,我创建了三个类name——leave、compoff和request。他们有一些创建/更新操作。现在在请求类中,我需要(离开,