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上。