【问题标题】:MySQL Count Where Two Columns are Same and Not Null, Same TableMySQL计数,其中两列相同且不为空,相同的表
【发布时间】:2015-09-09 07:13:05
【问题描述】:

我有一个包含以下数据的表格:

mysql> describe Post;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id     | int(11)      | NO   | MUL | NULL    |                |
| post_date   | datetime     | NO   |     | NULL    |                |
| in_reply_to | int(11)      | YES  |     | NULL    |                |
| text        | varchar(160) | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

mysql> select id as "Row ID", user_id as "User ID", post_date as "Post Date", IF(in_reply_to is NULL, "None", in_reply_to) as "In Reply To Post ID:", CONCAT(LEFT(text,40),"...") as "Post Text" from Post;
+--------+---------+---------------------+----------------------+---------------------------------------------+
| Row ID | User ID | Post Date           | In Reply To Post ID: | Post Text                                   |
+--------+---------+---------------------+----------------------+---------------------------------------------+
|      1 |       1 | 2015-08-14 20:38:00 | None                 | This is the original test post that I pu... |
|      2 |       2 | 2015-08-14 20:39:00 | None                 | This is the second post that I put into ... |
|      3 |       5 | 2015-08-14 22:00:00 | 1                    | Hahaha, that post was hilarious. I canno... |
|      4 |       4 | 2015-08-14 23:00:00 | 1                    | Today I saw a cat jump off the roof, ont... |
|      5 |       4 | 2015-08-14 23:00:00 | None                 | Today I saw a cat jump off the roof, ont... |
|     27 |       1 | 2015-09-08 05:53:40 | 2                    | This is a mad reply ay...                   |
|     28 |       1 | 2015-09-08 11:24:05 | None                 | Yolo Swag...                                |
+--------+---------+---------------------+----------------------+---------------------------------------------+
7 rows in set (0.05 sec)

如果您不确定它们代表什么,每列都有一个描述。对于这个问题,我关心的两列是idin_reply_to

in_reply_to 是一个NULLABLE FK 整数,它在同一个表中引用id;如果in_reply_toNULL,则表示该帖子是原始帖子,如果是整数值,则表示回复帖子,表示回复帖子的ID。

在下面的示例中,有 4 个原始帖子(1、2、5、28)和 3 个回复(3、4、27),即 3 是对 1 的回复,4 也是对 1 的回复,以及 27是对 2 的回复。我希望执行一个 SQL 查询,该查询会产生如下输出:

其中Num RepliesCOUNT,表示同一个表中有多少行的in_reply_to 等于id;如果没有对该帖子的回复,则显示 0(即,没有行包含特定帖子的 ID 作为其in_reply_to 列。

谢谢。

解决方案(根据安德斯的回答):

mysql> SELECT   Post.id, Post.user_id, Post.post_date, Post.in_reply_to, CONCAT(LEFT(Post.text,40)),   IF(counts.count IS NULL, 0, counts.count) AS 'Num of Replies' FROM Post LEFT JOIN    (SELECT      in_reply_to AS id,      COUNT(*) AS count    FROM Post    WHERE in_reply_to IS NOT NULL    GROUP BY in_reply_to) AS counts  ON Post.id = counts.id;
+----+---------+---------------------+-------------+------------------------------------------+----------------+
| id | user_id | post_date           | in_reply_to | CONCAT(LEFT(Post.text,40))               | Num of Replies |
+----+---------+---------------------+-------------+------------------------------------------+----------------+
|  1 |       1 | 2015-08-14 20:38:00 |        NULL | This is the original test post that I pu |              2 |
|  2 |       2 | 2015-08-14 20:39:00 |        NULL | This is the second post that I put into  |              1 |
|  3 |       5 | 2015-08-14 22:00:00 |           1 | Hahaha, that post was hilarious. I canno |              0 |
|  4 |       4 | 2015-08-14 23:00:00 |           1 | Today I saw a cat jump off the roof, ont |              0 |
|  5 |       4 | 2015-08-14 23:00:00 |        NULL | Today I saw a cat jump off the roof, ont |              0 |
| 27 |       1 | 2015-09-08 05:53:40 |           2 | This is a mad reply ay                   |              0 |
| 28 |       1 | 2015-09-08 11:24:05 |        NULL | Random Text                              |              0 |
+----+---------+---------------------+-------------+------------------------------------------+----------------+
7 rows in set (0.00 sec)

【问题讨论】:

  • 您的第一张图片已损坏。请以文本而不是图像的形式包含所有数据。
  • @Anders 我现在已经替换了它。

标签: mysql sql join count null


【解决方案1】:

您需要在同一张表上连接两个查询。第一个只选择所有帖子,第二个计算每个帖子的回复数。这是一个左连接,因为您想包含没有任何回复的帖子(第二个查询不会返回)。 IF 用于将NULL 值转换为0

SELECT
  post.id,
  -- Other fields...,
  IF(counts.count IS NULL, 0, counts.count) AS count
FROM post
LEFT JOIN 
  (SELECT
     in_reply_to AS id,
     COUNT(*) AS count
   FROM post
   WHERE in_reply_to IS NOT NULL
   GROUP BY in_reply_to) AS counts
 ON post.id = counts.id

免责声明:我没有对此进行测试。

【讨论】:

    【解决方案2】:

    您可以通过传统方式进行连接,也可以直接在新列中进行连接。

    例子:

    select a.id, 
    (select count(*) from (select 1 as id union all select 1 union all select 2)b where b.id=a.id) as count_of_replies
    
     from 
        (select 1 as id union all select 1  union all select 2)a
    

    注意 2 个子查询“表”都是同一个表。

    【讨论】:

      猜你喜欢
      • 2016-07-29
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      相关资源
      最近更新 更多