簡體   English   中英

在1個查詢中選擇/總和具有不同條件的列

[英]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  

我想在一個查詢中獲得posneg分數,但我不想使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM