【问题标题】:How to COUNT the number of rows where a column matches a column of another table如何计算一列与另一个表的列匹配的行数
【发布时间】:2015-01-04 22:44:49
【问题描述】:

我想显示用户发布的帖子数量,但我有几个不同的表,需要匹配 id 并计算它们。

类似这样的:

用户表

userid       username      email              regdate

  34          mister      email@some.tld    2013-10-26 12:01:07

帖子表

postid       creator        post_comment      post_title     status

  1            34          This is comment    Post 1         published
  2            12          This is comment    Post 2         published
  3            34          This is comment    Post 3         pending
  4            25          This is comment    Post 4         published
  5            34          This is comment    Post 5         published

现在我已经有一个查询,我从用户表中选择有关特定用户的所有数据:

mysqli_query($conn, "SELECT * FROM users WHERE userid = $userid");

$userid 是当前登录的用户的 ID。这很好用:它选择有关该用户的所有相关信息。

但我想显示每个用户发布的帖子数。我在 w3schools 的某处读到 SQL COUNT 函数的工作原理如下:

mysqli_query($conn, "SELECT COUNT(creator) AS userposts FROM posts WHERE creator=$userid");

但是,正如您在发布的表格示例中看到的那样,在 5 个帖子中,3 个来自用户 34,而这 3 个中的 1 个未发布。

我不知道如何进行 SQL 查询,该查询选择 userid 与 $userid 匹配的所有用户,然后从帖子中选择创建者和状态,并计算创建者为 $userid 且状态已发布的帖子数。

这是我最终的目标:

用户先生发布了 2 个帖子。

【问题讨论】:

标签: php mysql sql mysqli


【解决方案1】:

为了只获取已发布帖子的数量,您应该通过 ANDing status = 'published' 重构您的条件语句

mysqli_query($conn, "SELECT COUNT(creator) AS num_posts FROM posts 
WHERE creator=$userid AND status = 'published'");

【讨论】:

  • 是的,这可行,但现在这是单独的查询,我已经有一个查询来提取用户数据,我可以把它放在同一个查询中还是我需要第二个来统计帖子。
【解决方案2】:
SELECT COUNT(creator) AS userposts FROM posts p 
LEFT JOIN users u ON p.creator=u.userid 
WHERE creator=$userid AND status='published'

【讨论】:

    【解决方案3】:

    正如您在评论中所问的,一站式查询:

    SELECT users.*, COUNT(creator) AS userposts FROM users u 
    LEFT JOIN posts p ON p.creator = u.userid 
    WHERE p.creator = $userid AND p.status = 'published'
    

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多