我正在创建一个显示饼图的Web应用程序。为了获得一个HTTP请求从一个的PostgreSQL 9.3数据库图表中的所有数据,我结合多个SELECT
语句与UNION ALL
- 这里有一个部分:比多个SELECT语句更好的方法吗?
SELECT 'spf' as type, COUNT(*)
FROM (SELECT cai.id
FROM common_activityinstance cai
JOIN common_activityinstance_settings cais ON cai.id = cais.activityinstance_id
JOIN common_activitysetting cas ON cas.id = cais.id
JOIN quizzes_quiz q ON q.id = cai.activity_id
WHERE cai.end_time::date = '2015-09-12'
AND q.name != 'Exit Ticket Quiz'
AND cai.activity_type = 'QZ'
AND (cas.key = 'disable_student_nav' AND cas.value = 'True'
OR cas.key = 'pacing' AND cas.value = 'student')
GROUP BY cai.id
HAVING COUNT(cai.id) = 2) sub
UNION ALL
SELECT 'spn' as type, COUNT(*)
FROM common_activityinstance cai
JOIN common_activityinstance_settings cais ON cai.id = cais.activityinstance_id
JOIN common_activitysetting cas ON cas.id = cais.id
WHERE cai.end_time::date = '2015-09-12'
AND cai.activity_type = 'QZ'
AND cas.key = 'disable_student_nav'
AND cas.value = 'False'
UNION ALL
SELECT 'tp' as type, COUNT(*)
FROM (SELECT cai.id
FROM common_activityinstance cai
JOIN common_activityinstance_settings cais ON cai.id = cais.activityinstance_id
JOIN common_activitysetting cas ON cas.id = cais.id
WHERE cai.end_time::date = '2015-09-12'
AND cai.activity_type = 'QZ'
AND cas.key = 'pacing' AND cas.value = 'teacher') sub;
这将产生一个不错的,小响应回发给客户端:
type | count
------+---------
spf | 100153
spn | 96402
tp | 84211
我不知道我的查询是否可以提高效率。每个SELECT语句大多使用相同的JOIN操作。有没有办法不重复每个新的SELECT的JOIN?
而我实际上更喜欢单列3列。或者,一般来说,是否有一些完全不同但比我更好的方法呢?
公用表表达式可能是您的方法。 – Ginden
如果您没有提供像您这样的表定义,您应该*必须*在查询中至少对表格进行限定*所有*列,否则我们无法知道列的来源。你需要结果作为3行还是它可以是三列的单行? –
谢谢。他们现在合格('cas.key'和'cas.value')。 –