2017-06-27 73 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