2017-06-27 74 views
0

我在尋找最佳性能查詢來獲取關聯中不同枚舉的計數。使用最快的查詢獲得關聯計數

看看下面的SQL

CREATE TYPE ITEM_TYPE AS ENUM ('coming', 'new', 'archive'); 

CREATE TABLE centers 
(
    id SERIAL PRIMARY KEY, 
    name TEXT NOT NULL, 
    created_at timestamp without time zone default (now() at time zone 'utc'), 
    updated_at timestamp without time zone default (now() at time zone 'utc') 
); 

CREATE TABLE items 
(
    id SERIAL PRIMARY KEY, 
    center_id INT NOT NULL REFERENCES centers(id), 
    item_type ITEM_TYPE NOT NULL, 
    description TEXT NOT NULL, 
    created_at timestamp without time zone default (now() at time zone 'utc'), 
    updated_at timestamp without time zone default (now() at time zone 'utc') 
); 

我期待查詢所有的「中心」,但我也想返回基於ITEM_TYPE枚舉的項目數。

在下面的示例中,ItemNewCount和ItemArchiveCount與枚舉相關。

{ 
    id: 1, 
    name: 'Center Name', 
    ItemComingCount: 400, 
    ItemNewCount: 300, 
    ItemArchiveCount: 567 
} 
+0

這是什麼意思? ItemNewCount:300,ItemArchiveCount:567 – Vecchiasignora

+0

@Vecchiasignora我已經更新了這個問題。基本上,這些計數是不同的枚舉,所以實際上應該是3. – kevingilbert100

回答

1

只是結合left join, group by and Case運營商

試試這個

SELECT c.id, c.name, 
sum(case when i.item_type = 'coming' then 1 else 0 end) as ItemComingCount, 
sum(case when i.item_type = 'new' then 1 else 0 end) as ItemNewCount, 
sum(case when i.item_type = 'archive' then 1 else 0 end) as ItemArchiveCount 
from centers as c LEFT JOIN items as i ON c.id = i.center_id 
group by c.id, c.name 
+0

魔術:)謝謝先生! – kevingilbert100

+0

歡迎您:) – Vecchiasignora