我目前正在查看SQLite 3.8.7.1(Debian Jessie)中的评级数据库,而且我有一些难以从单个查询中获取我想要的聚合以返回到Web应用程序。
通过我在大学和大量文档中对SQL类的记忆进行疏导,我有一个查询可以查找总评分,以及每个评分项目的正负计数,但我不相信我有这是一种明智的方式,或者它会变得特别有效。
<{1}}上的sqlfiddle.com
<{3}}
基本上我有一个项目密钥,然后是评分它的人的用户名,在所有情况下当前设置为NULL
的语言字段,评分日期以及1
或{{1}在值字段中。我想返回一个包含所有项目的表格,其中列表包含正面评级数,负面评级数和总体评分(正面减去负数)。
我可以以某种方式删除子查询或使它们更有效吗?我可以在SQLite中采用其他方法吗?
实际上,我的查询返回总负面评分的负数;我可以这样做吗?
答案 0 :(得分:0)
以下是基于汇总功能的提案
在具有双键group-by
的公用表表达式的基础上。
我更改了负数的值,表示为正数,
但当然他们被认为是消极的
我也避免使用“NULL”条目,考虑到它们很难看,它还确保min / max返回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
您可能会将公用表表达式计为一个子查询,但它只有一个 有意义地测试速度可能需要数据库的全部内容,而不是小小提琴。