![](/img/trans.png)
[英]MySql how to select sum column with 2 different where conditions in 1 query
[英]select/sum of a column with different conditions in 1 query
$pos = select * from score_history where content_id = 6 && val = 1
$neg = select * from score_history where content_id = 6 && val = -1
我想在一個查詢中獲得pos
和neg
分數,但我不想使用join
那么也許是某種IF /案例陳述?
我有這個,但你可以猜到它失敗了
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' ";
有沒有辦法在不使用連接或子查詢的情況下執行此操作?
您可以利用MySQL的靈活性來處理布爾值和整數:
SELECT count(*) total, sum(val = 1) pos, sum(val = -1) neg
FROM score_history
WHERE content_id = '46083';
只要條件為真,它就是1.否則為0.不需要CASE,也不需要GROUP BY。
關! 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
SUM(CASE WHEN `val` = 1 THEN 1 ELSE O END) AS pos_count,
SUM(CASE WHEN `val` = -1 THEN 1 ELSE O END) AS neg_count
FROM score_history WHERE `content_id` = '46083';
嘗試這個。 對不起,我無法測試,這台筆記本電腦沒有數據庫。
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(*), val from score_history where content_id = 6 group by val;
你很親密; 嘗試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(*)
from score_history
where content_id = 6 &&
(val = -1 or val=1)
group by val
我認為這個陳述應該有效但我已經在DBMS上進行了測試。
SELECT count(*) as total ,
count(case when val = 1 then 1 else null end) as pos,
count(case when val = -1 then 1 else null end) as neg
FROM score_history
WHERE `content_id` = '46083';
請參見SQLFIDDLE
好的,很多這些答案都很接近,但無論何時使用聚合函數,都應該使用group by
。
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);
如果您想了解如何在此處使用group by
和aggregate函數: https : //dev.mysql.com/doc/refman/5.0/en/group-by-functions.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.