2013-12-17 88 views
0

我想选择表中的两列和另一列的关联行数。 基本上,我有两个表:选择一些列和计数

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

下你能认罪帮我解决这个问题?

回答

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 joinrem列的表格,组连接,然后你可以指望每个rem记录。

+1

否“GROUP BY”? – Kermit

+0

哈,你打我吧! :) – Kell

+1

应该用'rem.rem_id'进行分组以避免含糊不清。 –

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

你基本上有三种选择。

默认转到查询是:

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 

窗口功能大多是有用的,当你需要创造什么样的条款(使用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 

第三和最后一个选项是在rem保持cnt柱,并使用map上的触发器对其进行维护。在这种情况下,您只需选择该额外的列。就性能而言,这是最好的方法。事实上,如果您打算实际订购cnt,这是唯一合理的。

+1

你也可以使用'count()'作为窗口函数来删除'group by'所需的用法 –