如何使用 join 来选择返回消息行的类似计数

语境

当我尝试返回消息值行并查找存储在不同表中的相应的类似计数时,我无法理解 JOIN 语句的应用程序。我尝试从中提取的第一个表包含我想要的消息:

SELECT forums.forum_id, forums.message FROM forums LIMIT 3

然后,我尝试使用结果forum_id值插入到第二个查询中,该查询获得类似的计数:

SELECT COUNT(forumvotes.forum_id) AS voteCount FROM forumvotes JOIN forums ON forumvotes.forum_id = forums.forum_id 
WHERE forumvotes.forum_id = [insert returned forum ids here]

问题

我相信我可以通过使用联接将这两个查询合并为一个,但我不确定如何做到这一点。当我像这样组合两者时,新voteCount列返回已插入的所有论坛投票的计数,而不仅仅是我想要的三个特定消息的喜欢计数:

SELECT forums.forum_id, forums.message, 
(SELECT COUNT(forumvotes.forum_id) AS voteCount FROM forumvotes JOIN forums ON forumvotes.forum_id = forums.forum_id WHERE forumvotes.forum_id = forums.forum_id) AS voteCount 
FROM forums LIMIT 3

因此,查询返回三行,每行都包含单独的消息(这很好),但它们也返回相同的voteCount值 13,因为数据库中已插入 13 个点赞,但每行的voteCount值只能是一个或两个,因为每条消息只有一两个点赞。

如何将这两个查询合并为一个?如果有任何困惑请告诉我。


湖上湖
浏览 111回答 3
3回答

手掌心

您需要将子查询与外部查询正确关联。问题是您对外部和内部使用相同的别名,因此子句中的条件WHERE实际上并没有过滤任何内容。您应该使用表别名来避免此问题。forum无论如何,没有必要在子查询中使用该表。您可以将其写为:SELECT     f.forum_id,     f.message,     (        SELECT COUNT(*)         FROM forumvotes fv         WHERE fv.forum_id = f.forum_id    ) AS voteCount FROM forums fORDER BY ??LIMIT 3ORDER BY如果您希望结果在连续执行中保持一致,您还需要一个子句。

叮当猫咪

根据您的描述,您可能希望在此处执行“IN”子查询。SELECT COUNT(forumvotes.forum_id) AS voteCount FROM forumvotes  WHERE forumvotes.forum_id IN (SELECT forums.forum_id, forums.message FROM forums LIMIT 3)具体来说,这将只返回前三个论坛行的 id,并将它们与一些论坛信息连接起来

呼如林

我将论坛表设置为包含每个的JOIN嵌套查询COUNT, GROUP BYforum_idSELECT f.forum_id, f.message, a.voteCount  FROM forums f  JOIN (SELECT COUNT(forumvotes.forum_id) AS voteCount, forumvotes.forum_id          FROM forumvotes         GROUP BY forumvotes.forum_id) a ON f.forum_id = a.forum_id
打开App,查看更多内容
随时随地看视频慕课网APP