我想在表格中选择两列,并从另一列中选择相关行的计数。 基本上,我有两张桌子:
表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下
你能帮我解决这个问题吗?
答案 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
实际订购,那么这是唯一合理的。