2013-12-17 51 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'所需的用法 –