2017-06-15 41 views
0

我目前正在查看SQLite 3.8.7.1(Debian Jessie)中的评级数据库,并且我正在从一个查询中获取想要的聚合以返回到Web应用程序。在计算SQLite中的多个聚合时可以消除子查询吗?

疏通我在uni和大量文档中对SQL类的记忆,我有一个查询,可以找到总评分,以及每个评价项目的正面和负面计数,但我并不确信自己得到了一个明智的做法,或者它将会特别有效。

裸露的骨头上sqlfiddle.comhttp://www.sqlfiddle.com/#!7/a71acb/1

基本上我有一个项目的关键,那么这个人的用户名评价它,语言领域的当前设置为NULL在所有情况下,评级,要么1日期或值域中的-1。我想要返回所有项目的表格,其中包含正面评分数量,负面评价数量和总体评分(正面负面消极)的列。

我可以以某种方式删除子查询或使其更有效吗?我可以在SQLite中寻找替代方法吗?

其实,我的查询返回一个负数的负总评分;我可以使这个积极的?

回答

0

这是一个基于集合函数
的建议,基于公钥表格表达式,带有双键group-by

我改变了负值的数值,将其表示为正数,
但当然它们被计数为负数。
我也避免了“NULL”条目,考虑到它们很丑,它也确保最小/最大返回0或0的一边。否则,我相信结果是期望的输出。

with subtotals(titem, subtotal) as 
(select item 
     , sum(value) 
from ratings 
group by item, value) 
select titem as item 
    , sum(subtotal) as total 
    , max(0, max(subtotal)) as pos 
    , -1*min(0, min(subtotal)) as neg 
from subtotals 
group by titem; 

输出(.width 20.headers on.mode columns):

item     total  pos   neg 
-------------------- ---------- ---------- ---------- 
africa    1   2   1 
cant-buy-me-love  3   3   0 
happy-together  -2   0   2 
solitaire    0   1   1 

你可能会算公用表表达式为一个子查询,但它是唯一的一个。
有意义的速度测试可能需要数据库的全部内容,而不是小提琴。

相关问题