如何使用join选择返回消息行的like计数

tzcvj98z  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(307)

上下文
当我试图返回消息值的行并找到它们对应的like计数(它们存储在不同的表中)时,我很难理解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]

问题
我相信我可以通过使用join将这两个查询组合成一个查询,但我不确定如何做到这一点。当我把两者结合起来的时候,新的 voteCount column返回已插入的所有论坛投票数,而不仅仅是我想要的三条特定消息的赞数:

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

因此,查询返回三行,每行都包含invidual消息(这很好),但它们也返回相同的消息 voteCount 值为13,因为已经有13个赞插入到数据库中,但每行的 voteCount 值应该只有一个或两个,因为每条消息只有一个或两个赞。
如何将这两个查询合并为一个查询?如果有任何困惑,请告诉我。

avwztpqn

avwztpqn1#

您需要正确地将子查询与外部查询关联起来。问题是外部和内部使用相同的别名,因此 WHERE 子句实际上并不过滤任何内容。您应该使用表别名来避免这个问题。
没有必要使用 forum 子查询中的表。你可以这样写:

SELECT 
    f.forum_id, 
    f.message, 
    (
        SELECT COUNT(*) 
        FROM forumvotes fv 
        WHERE fv.forum_id = f.forum_id
    ) AS voteCount 
FROM forums f
ORDER BY ??
LIMIT 3

你还需要一个 ORDER BY 子句,如果希望结果在连续执行中保持一致。

h22fl7wq

h22fl7wq2#

根据您对这一点的描述,您可能希望在这里执行一个“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,并将它们与一些论坛信息连接起来

fv2wmkja

fv2wmkja3#

JOIN 将forums表转换为包含 COUNT, GROUP BY 每个 forum_id ```
SELECT 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

相关问题