选择一些列和计数

时间:2013-12-17 16:43:39

标签: sql postgresql

我想在表格中选择两列,并从另一列中选择相关行的计数。 基本上,我有两张桌子:

rem

rem_id (Int, AI, Index) | rem_name (Varchar)

map

rem_id (Int, AI, Index) | data (Text)

我想获取表rem的两列以及每行存储的数据条目数。

我尝试使用以下查询,但它不起作用:

SELECT
    rem_id,
    rem_name,
    COUNT(
         SELECT map.rem_id
         FROM map
         WHERE map.rem_id = rem.rem_id)
FROM rem;

我在Postgresql 9.3下

你能帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

SELECT rem.rem_id,
       rem.rem_name,
       COUNT(map.rem_id) as cnt
FROM rem
LEFT JOIN map ON map.rem_id = rem.rem_id
GROUP BY rem.rem_id, rem.rem_name

使用left join连接表格,按rem列分组,然后您可以计算每个rem记录。

答案 1 :(得分:1)

SELECT rem_id,rem_name,(SELECT COUNT(map.rem_id) FROM map
WHERE map.rem_id = rem.rem_id) FROM rem;

答案 2 :(得分:0)

你基本上有三种选择。

默认的goto查询是:

SELECT rem.rem_id,
       rem.rem_name,
       COUNT(*) as cnt
FROM rem
LEFT JOIN map ON map.rem_id = rem.rem_id
GROUP BY rem.rem_id, rem.rem_name

将其视为衡量标准。

从语义上讲,后者大致相当于使用窗口函数的相同查询:

SELECT rem.rem_id,
       rem.rem_name,
       COUNT(*) OVER (PARTITION BY rem.rem_id) as cnt
FROM rem
LEFT JOIN map ON map.rem_id = rem.rem_id

当您需要在同一组上创建多个group by子句(使用partition by)时,窗口函数非常有用。

如果预先选择了有限数量的行,相关子查询的工作效果通常会更好

SELECT rem.rem_id,
       rem.rem_name,
       (SELECT COUNT(*) FROM map WHERE map.rem_id = rem.rem_id) as cnt
FROM rem
ORDER BY rem.ren_name LIMIT 10 OFFSET 10 -- As an example

第三个也是最后一个选项是在cnt中维护rem列,并使用map上的触发器维护它。在这种情况下,您只需选择额外的列。就性能而言,这是最好的方法。事实上,如果您计划按cnt实际订购,那么这是唯一合理的。