困难的SQL子查询来计算一些东西

时间:2014-01-12 02:58:50

标签: sql database postgresql subquery

我正在开发一个jQuery移动应用程序,因此我需要在我的数据库中计算一些东西。我花了几个小时的时间问一些同学,但它不起作用。

数据库:带子查询的PostgreSQL

例如:我的一个子查询的结构:

app.get('/getNumber', function(req, res) {
    getFromDB("SELECT COUNT(p.*) AS rooms 
               FROM park_rooms p 
               WHERE p.park_house_id = " + req.param("house"), req, res)
})

问题出现了:

enter image description here

Larger description image: klick


我需要的是什么:

我希望使用result=0 计算表格分类中的所有park_house_id = 0

但是:只有最高框架park_room_id没有多个park_room_ids

是否有一些数据库专家可以向我展示一个子查询来解决这个问题?

2 个答案:

答案 0 :(得分:2)

首先我们希望来自classification的行属于park_house_id = 1,因此我们所做的是内部联接classificationpark_room,其中此条件为真,使用:

 SELECT *
 FROM park_room pr
 INNER JOIN classification c ON c.park_room_id = pr.id
 WHERE pr.park_house_id = 1

现在,对于我们想要查找最大帧数的每个park_room_id,我们使用MAX()函数和GROUP BY park_room.id执行此操作,或者在我们的情况下,我们使用了别名{{} 1}}为park_room所以pr。我们将最大帧数别名为maxframe

GROUP BY pr.id

最后,我们要计算 SELECT pr.id,max(c.frame) as maxframe FROM park_room pr INNER JOIN classification c ON c.park_room_id = pr.id WHERE pr.park_house_id = 1 GROUP BY pr.id 中每个classification的{​​{1}}个数为maxframe且零frame为{0}的行数)。因此,我们通过park_room_id将上述结果加回到result,以检查if classification并简单地计算满足此条件的park_room_id。所以我们的最终查询是。 (注意上面的查询现在是一个子查询,用于在我们的最终查询中生成一个别名为result = 0的表。)

maxframe

请尝试此sqlFiddle

答案 1 :(得分:1)

with t as (
   select 
     park_room_id, 
     max(frame) maxframe
   from classification 
   group by park_room_id
  ) 
select
  count(*)
from
  classification c inner join park_room r on
  c.park_room_id = r.id 
  and 
  c.result = 0 join t on t.park_room_id = c.park_room_id
where
  r.park_house_id = 1
  and
  c.frame = t.maxframe
;

SQLFIDDLE