mysql 在选择中计数或在子查询中计数

标签 mysql

我该如何将此查询实现到更复杂的查询中?

SELECT count(`p`.`id`) as count 
FROM `wallPosts` `p` LEFT JOIN `wallPosts` `c` on `c`.`parentID` = `p`.`id` 
where `p`.`parentID` is not null group by `p`.`parentID`

返回:

+-------+
| count |
+-------+
|     3 |
|     2 |
+-------+

我已将“复杂”查询简化为:

SELECT `p`.`id`, 
       `p`.`parentid`, 
       `p`.`commenterid`, 
       `p`.`userid`, 
       `p`.`post`, 
       `p`.`date`, 
       `p`.`tags`, 
       CASE 
         WHEN ( `p`.`userid` = `p`.`commenterid` 
                AND `p`.`parentid` IS NULL ) THEN 'true' 
         ELSE 'false' 
       end AS isMain 
FROM   `wallposts` `p` 
       LEFT JOIN `wallposts` `c` 
              ON `c`.`parentid` = `p`.`id` 
       LEFT JOIN `users` 
              ON `users`.`id` = `p`.`commenterid` 
GROUP  BY `p`.`id` 
HAVING `ismain` = 'true' 
ORDER  BY `p`.`date` DESC 
LIMIT  20 

返回:

+----+----------+-------------+--------+--------+---------------------+------+--------+
| id | parentID | commenterID | userID |  post  |        date         | tags | isMain |
+----+----------+-------------+--------+--------+---------------------+------+--------+
|  5 | NULL     |           1 |      1 | post#1 | 2013-07-26 13:29:02 | NULL | true   |
|  1 | NULL     |           1 |      1 | post#2 | 2013-07-26 13:28:23 | NULL | true   |
+----+----------+-------------+--------+--------+---------------------+------+--------+

这就是我想要的:

+----+----------+-------------+--------+--------+---------------------+------+--------+-------+
| id | parentID | commenterID | userID |  post  |        date         | tags | isMain | count |
+----+----------+-------------+--------+--------+---------------------+------+--------+-------+
|  5 | NULL     |           1 |      1 | post#1 | 2013-07-26 13:29:02 | NULL | true   |     3 |
|  1 | NULL     |           1 |      1 | post#2 | 2013-07-26 13:28:23 | NULL | true   |     2 |
+----+----------+-------------+--------+--------+---------------------+------+--------+-------+

这是我的完整表格:

+----+----------+-------------+--------+---------+------+---------------------+
| id | parentID | commenterID | userID |  post   | tags |        date         |
+----+----------+-------------+--------+---------+------+---------------------+
|  1 | NULL     |           1 |      1 | post#1  | NULL | 2013-07-26 13:28:23 |
|  2 | 1        |           1 |      1 | reply#1 | NULL | 2013-07-26 13:28:28 |
|  3 | 1        |           1 |      1 | reply#2 | NULL | 2013-07-26 13:28:38 |
|  4 | 1        |           1 |      1 | reply#3 | NULL | 2013-07-26 13:28:54 |
|  5 | NULL     |           1 |      1 | post#2  | NULL | 2013-07-26 13:29:02 |
|  6 | 5        |           1 |      1 | reply#1 | NULL | 2013-07-26 13:29:05 |
|  7 | 5        |           1 |      1 | reply#2 | NULL | 2013-07-26 13:29:06 |
+----+----------+-------------+--------+---------+------+---------------------+

如您所见,我正在尝试计算每个帖子有多少回复。

感谢您的帮助!

最佳答案

我已经回答过你类似的问题了。只需引用http://sqlfiddle.com/#!2/9a6cc/9 。也许它适合你

SELECT `p`.`id`, 
       `p`.`parentid`, 
       `p`.`commenterid`, 
       `p`.`userid`, 
       `p`.`post`, 
       `p`.`date`, 
       `p`.`tags`, 
       CASE 
         WHEN ( `p`.`userid` = `p`.`commenterid` 
                AND `p`.`parentid` IS NULL ) THEN 'true' 
         ELSE 'false' 
       end AS isMain ,
        cnt.count1
FROM   `wallposts` `p` 
       LEFT JOIN `wallposts` `c` 
              ON `c`.`parentid` = `p`.`id` 
       LEFT JOIN `users` 
              ON `users`.`id` = `p`.`commenterid` 
       LEFT JOIN (SELECT count(`p`.`id`) as count1,parentid FROM `wallPosts` `p` where parentid is not null group by parentid) cnt ON 
                  cnt.parentid = p.id
GROUP  BY `p`.`id` 
HAVING `ismain` = 'true' 
ORDER  BY `p`.`date` DESC 
LIMIT  20 ;

关于mysql 在选择中计数或在子查询中计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17882982/

相关文章:

MYSQL JOIN 并根据 MA​​X 获取整行

php - 从 mysql 数据库获取选项框的值

php - 如何长期积累红利?

MySQL:事务隔离级别、死锁

php - 使用 mysql 完成所需的数量

mysql - 将 LIMMYSQL.dll 从 MySql 复制到 Ruby bin 文件夹时出现 Rails 服务器错误

batch-file - mysqldump 批处理脚本以输出单个表以进行选择性还原

mysql - 识别和消除 hive 中的重复记录

mysql - 从 2 个时间戳中过滤日期时间

mysql - 试图从 SQL Server 2008 二进制类型中提取数据