Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何单独计算匹配的行数?_Mysql_Sql - Fatal编程技术网

Mysql 如何单独计算匹配的行数?

Mysql 如何单独计算匹配的行数?,mysql,sql,Mysql,Sql,以下是我的表格结构: -- qanda (stands for questions and answers) +----+---------+-----------------------------------------------+--------------+-----------+------+ | id | title | content | question_id | user_id | type

以下是我的表格结构:

-- qanda (stands for questions and answers)
+----+---------+-----------------------------------------------+--------------+-----------+------+
| id |  title  |                      content                  |  question_id |  user_id  | type |
+----+---------+-----------------------------------------------+--------------+-----------+------+
| 1  | title1  | this is a question                            | NULL         | 213423    | 0    |
| 2  | NULL    | this is an answer                             | 1            | 435344    | 1    |
| 3  | NULL    | this is another answer                        | 1            | 432435    | 1    |
| 4  | title2  | this is another question                      | NULL         | 124324    | 0    |
| 5  | NULL    | this is an answer for the second question     | 4            | 213423    | 1    |
| 6  | NULL    | this is another answer for the first question | 1            | 213423    | 1    |
+----+---------+-----------------------------------------------+--------------+-----------+------+
我想分别计算问题和答案的数量。我该怎么做

此用户的预期结果::user_id=213423

我可以分别通过两个查询来实现这一点:

SELECT count(*) q_num FROM qanda WHERE user_id = :user_id AND question_id IS NULL

SELECT count(*) a_num FROM qanda WHERE user_id = :user_id AND question_id IS NOT NULL
我可以在一个查询中完成吗?

您只需执行以下操作:

SELECT count(questionid) as q_num,
       sum(questionid is null) as a_num
FROM qanda
WHERE user_id = :user_id ;
count with a column或expression统计非空值的数量—这正是您想要做的。MySQL在数字上下文中将布尔值视为整数,1表示真,0表示假

你也可以这样写:

(count(*) - count(questionid)) as a_num

编辑:

使用类型,可以使用变体:

select sum(type = 0) as q_num, sum(type = 1) as a_num
您只需执行以下操作:

SELECT count(questionid) as q_num,
       sum(questionid is null) as a_num
FROM qanda
WHERE user_id = :user_id ;
count with a column或expression统计非空值的数量—这正是您想要做的。MySQL在数字上下文中将布尔值视为整数,1表示真,0表示假

你也可以这样写:

(count(*) - count(questionid)) as a_num

编辑:

使用类型,可以使用变体:

select sum(type = 0) as q_num, sum(type = 1) as a_num
尝试上面的查询

正如我在上面的查询中所写的,我使用了question_id为NULL,它将为true生成1,为false生成0,所以SUMquestion_id不为NULL将生成问题的精确计数

答案也是一样

尝试上面的查询

正如我在上面的查询中所写的,我使用了question_id为NULL,它将为true生成1,为false生成0,所以SUMquestion_id不为NULL将生成问题的精确计数

答案也是一样。

使用带有CASE语句的SUM将实现这一点

SELECT SUM(CASE WHEN question_id IS NULL 
                THEN 1
                ELSE 0
           END) AS q_num,
       SUM(CASE WHEN question_id IS NOT NULL 
                THEN 1
                ELSE 0
           END) AS a_num 
FROM qanda
WHERE user_id = :user_id
用户_id的输出='213423'

SQL FIDLE:

使用SUM和CASE语句将完成此任务

SELECT SUM(CASE WHEN question_id IS NULL 
                THEN 1
                ELSE 0
           END) AS q_num,
       SUM(CASE WHEN question_id IS NOT NULL 
                THEN 1
                ELSE 0
           END) AS a_num 
FROM qanda
WHERE user_id = :user_id
用户_id的输出='213423'


SQL FIDLE:

将任何内容与NULL进行比较都会产生NULL。若要测试列是否包含NULL,请使用IS NULL或NOT NULL。将任何内容与NULL进行比较将生成NULL。要测试列是否包含NULL,请使用IS NULL或NOT NULL。在上次查询中,有两个a_num。其中一个应该是q_num。谢谢,upvote@MartinAJ . . . 这不是一个疑问。这是做同一件事的两种方法。好吧,我问的问题不够准确。实际上,我还有一个列名为type。它包含0个问题和1个答案。你能告诉我现在该怎么处理吗?很抱歉再次打电话给你,我认为回答的条件是多余的。您可以简单地将sumtype写为一个_num,而无需sumtype=1。我说的对吗?@MartinAJ。是的,你可以。然而,这似乎有点危险,因为可能会出现其他类型。如果列名为isAnswer,那么我会更确信该值始终为0或1。在您上次的查询中,有两个a_num。其中一个应为q_num。谢谢,upvote@MartinAJ . . . 这不是一个疑问。这是做同一件事的两种方法。好吧,我问的问题不够准确。实际上,我还有一个列名为type。它包含0个问题和1个答案。你能告诉我现在该怎么处理吗?很抱歉再次打电话给你,我认为回答的条件是多余的。您可以简单地将sumtype写为一个_num,而无需sumtype=1。我说的对吗?@MartinAJ。是的,你可以。然而,这似乎有点危险,因为可能会出现其他类型。如果该列被称为isAnswer,那么我更确信该值始终为0或1。