Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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
Php 在1个查询中选择/求和具有不同条件的列_Php_Mysql_Sql - Fatal编程技术网

Php 在1个查询中选择/求和具有不同条件的列

Php 在1个查询中选择/求和具有不同条件的列,php,mysql,sql,Php,Mysql,Sql,我想在一次查询中获得pos和neg分数 但是我不想用join 那么也许是某种IF/case语句 我有这个,但你可以猜到它失败了 $pos = select * from score_history where content_id = 6 && val = 1 $neg = select * from score_history where content_id = 6 && val = -1 有没有不使用联接或子查询的方法来执行此操作?关闭!CASE语句

我想在一次查询中获得
pos
neg
分数 但是我不想用join

那么也许是某种IF/case语句

我有这个,但你可以猜到它失败了

$pos = select * from score_history where content_id = 6 && val = 1 
$neg = select * from score_history where content_id = 6 && val = -1  

有没有不使用联接或子查询的方法来执行此操作?

关闭!
CASE
语句不会返回多列,因此您需要2个
CASE
语句,并将它们包装在一个
SUM()
中:

SELECT  count(*) as total , 
CASE 
    WHEN `val` =  1  THEN count(*) as `pos` 
    WHEN `val` = -1  THEN count(*) as `neg` 
END
FROM    score_history WHERE `content_id` = '46083' ";

接近!
CASE
语句不会返回多列,因此您需要2个
CASE
语句,并将它们包装在一个
SUM()
中:


试试这个。抱歉,我无法测试,此笔记本电脑上没有数据库

SELECT  count(*) as total 
  ,SUM(CASE WHEN `val` =  1  THEN 1 ELSE 0 END) as `pos`
  ,SUM(CASE WHEN `val` =  -1  THEN 1 ELSE 0 END) as `neg` 
FROM    score_history WHERE `content_id` = '46083' ;

试试这个。抱歉,我无法测试,此笔记本电脑上没有数据库

SELECT  count(*) as total 
  ,SUM(CASE WHEN `val` =  1  THEN 1 ELSE 0 END) as `pos`
  ,SUM(CASE WHEN `val` =  -1  THEN 1 ELSE 0 END) as `neg` 
FROM    score_history WHERE `content_id` = '46083' ;

不确定这是否是最佳答案(假设表中有许多行,您肯定希望val列上有一个索引),但这肯定会起作用-同时假设您只有1和-1作为值:

select 
count(*) as total,
sum(case val when  1 then 1 else 0 end) as pos,
sum(case val when -1 then 1 else 0 end) as neg
from score_history
where content_id = 6

不确定这是否是最佳答案(假设表中有许多行,您肯定希望val列上有一个索引),但这肯定会起作用-同时假设您只有1和-1作为值:

select 
count(*) as total,
sum(case val when  1 then 1 else 0 end) as pos,
sum(case val when -1 then 1 else 0 end) as neg
from score_history
where content_id = 6

你很接近;尝试
SUM
功能:

SELECT count(*), val from score_history where content_id = 6 group by val;

你很接近;尝试
SUM
功能:

SELECT count(*), val from score_history where content_id = 6 group by val;
我认为这句话应该行得通,但我已经在DBMS上进行了测试


我认为这句话应该行得通,但我已经在DBMS上进行了测试。

好的,很多答案都很接近,但无论何时使用聚合函数,都应该使用
分组方式

select count(*) 
from score_history  
where content_id = 6 && 
      (val = -1 or val=1) 
group by val

如果您想在此处详细了解如何使用
分组依据和聚合函数:

好的,很多答案都很接近,但无论何时使用聚合函数,您都应该使用
分组依据

select count(*) 
from score_history  
where content_id = 6 && 
      (val = -1 or val=1) 
group by val

如果您想了解如何在此处使用
分组方式和聚合函数:

您可以利用MySQL的灵活性来处理布尔值和整数:

SELECT  count(*) as total 
      , (CASE WHEN `val` >= 0 THEN 'positive' ELSE 'negative' END) as interpreted_value
END
FROM    score_history 
WHERE  `content_id` = '46083'
GROUP BY (CASE WHEN `val` >= 0 THEN 'positive' ELSE 'negative' END);

只要条件为真,则为1。否则为0。无需使用CASE或GROUP BY。

您可以利用MySQL的灵活性来处理布尔值和整数:

SELECT  count(*) as total 
      , (CASE WHEN `val` >= 0 THEN 'positive' ELSE 'negative' END) as interpreted_value
END
FROM    score_history 
WHERE  `content_id` = '46083'
GROUP BY (CASE WHEN `val` >= 0 THEN 'positive' ELSE 'negative' END);
SELECT  count(*) total, sum(val = 1) pos, sum(val = -1) neg
FROM    score_history 
WHERE   content_id = '46083';
只要条件为真,则为1。否则为0。不需要案例,也不需要分组

SELECT  count(*) total, sum(val = 1) pos, sum(val = -1) neg
FROM    score_history 
WHERE   content_id = '46083';
请参见



请参见

在这一点上,你真的应该有一个
group by
。除非我误解了这个问题,OP想要总计数、
pos
计数和
neg
计数,
SELECT
子句中的所有项目都是聚合函数,所以不需要
group by
一个公平点。。。我想我并不是真的那样理解这个问题。他说他想在“一个查询”中得到它,但没有说他想要“一个结果”。这是一个很好的观点。在这一点上,你真的应该有一个
group by
。除非我误解了这个问题,OP想要总数,
pos
的计数和
neg
的计数,
SELECT
子句中的所有项都是聚合函数,因此不需要使用
groupby
fair point。。。我想我并不是真的那样理解这个问题。他说他想在“一个查询”中找到它,但没有说他想在“一个结果”中找到它。这是一个很好的观点。有趣的是,我认为使用group by会减慢我的查询速度。。。显然,在这种情况下,我应该使用它。实际上,不需要使用group by。这将导致两行,一行为
pos
count,一行为
neg
count,并且不会显示总计数。这取决于你在追求什么。你的查询可以简化到不需要group by,只返回3列。看我的答案。山羊公司是对的,这完全取决于你在追求什么。
分组依据
不会减慢查询速度。我将您的问题解释为您希望一个查询为您提供两个值,但我认为您不一定希望它们位于同一行。有趣的是,我认为使用group by会减慢我的查询速度。。。显然,在这种情况下,我应该使用它。实际上,不需要使用group by。这将导致两行,一行为
pos
count,一行为
neg
count,并且不会显示总计数。这取决于你在追求什么。你的查询可以简化到不需要group by,只返回3列。看我的答案。山羊公司是对的,这完全取决于你在追求什么。
分组依据
不会减慢查询速度。我将您的问题解释为您希望一个查询为您提供两个值,但我认为您不一定希望将它们放在同一行。这样的花絮很有趣,因为我几乎所有的时间都花在SQL Server上。这样的花絮很有趣,因为我几乎所有的时间都花在SQL Server上。