【问题标题】:How to use join to select like count of returned message rows如何使用连接来选择返回的消息行数
【发布时间】:2020-10-11 18:31:21
【问题描述】:

上下文

当我尝试返回多行消息值并找到存储在不同表中的相应类似计数时,我无法理解 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 值应该只有一两个,因为每条消息只有一两个赞。

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

【问题讨论】:

    标签: php sql join select count


    【解决方案1】:

    我将JOIN 论坛表添加到一个嵌套查询,其中包含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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案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 f
        ORDER BY ??
        LIMIT 3
        

        如果您想要在连续执行中保持一致的结果,您还需要一个 ORDER BY 子句。

        【讨论】:

          猜你喜欢
          • 2011-09-21
          • 2011-09-01
          • 1970-01-01
          • 2021-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-02
          • 1970-01-01
          相关资源
          最近更新 更多