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

pos1 つのクエリでとスコアを取得したいが、negjoin を使用したくない

おそらく何らかの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' ";

結合またはサブクエリを使用せずにこれを行う方法はありますか?

4

9 に答える 9

3

MySQL の柔軟性を利用して、ブール値と整数を処理できます。

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

条件が真の場合は常に 1 です。それ以外の場合は 0 です。CASE も GROUP BY も必要ありません。

于 2013-09-02T01:35:40.727 に答える
2

近い!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' ;
于 2013-09-02T01:16:36.980 に答える
0
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';
于 2013-09-02T01:16:36.133 に答える
0

これを試して。テストできません。このラップトップにはデータベースがありません。

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
于 2013-09-02T01:17:00.950 に答える
0

これが最良の答えであるかどうかはわかりません (そして、テーブルに多くの行があると仮定すると、確かに val 列にインデックスが必要になります) が、これは確かに機能するはずです - また、値として 1 と -1 しかないと仮定すると:

SELECT count(*), val from score_history where content_id = 6 group by val;
于 2013-09-02T01:17:07.363 に答える
0

あなたは近くにいました。関数を試してください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';
于 2013-09-02T01:18:14.763 に答える
0
select count(*) 
from score_history  
where content_id = 6 && 
      (val = -1 or val=1) 
group by val

このステートメントは機能するはずですが、DBMS でテストしました。

于 2013-09-02T01:22:52.440 に答える
0
 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を参照してください

于 2013-09-02T01:44:54.307 に答える
-1

さて、これらの答えの多くは近いですが、集計関数を使用するときはいつでも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ここで関数の使用方法と集約方法を読みたい場合: https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

于 2013-09-02T01:24:07.503 に答える