2013-05-07 44 views
3

我有以下DB模式:返回0計數在Postgres的jonined查詢

CREATE SCHEMA products; 

CREATE TABLE products.product_group (
    id bigserial NOT NULL PRIMARY KEY, 
    name varchar(255) NOT NULL 
) 

CREATE TABLE products.product (
    id bigserial NOT NULL PRIMARY KEY, 
    name varchar(255) NOT NULL, 
    product_group_id bigint REFERENCES products.product_group(id), 
    color varchar(255) NOT NULL 
) 

INSERT INTO products.product_group(name) values ('product group 1'); 

INSERT INTO products.product(name,product_group_id,color) VALUES ('product 1',1,'RED'); 
INSERT INTO products.product(name,product_group_id,color) VALUES ('product 1',1,'BLUE'); 
INSERT INTO products.product(name,product_group_id,color) VALUES ('product 1',1,'GREEN'); 

如果我執行以下查詢:

SELECT count(*), pg.name FROM products.product p 
LEFT JOIN products.product_group pg ON (p.product_group_id=pg.id) 
WHERE pg.id = 1 
AND p.color = 'RED' 
GROUP BY pg.name 

我得到的結果是:

1;"product group 1" 

如果我執行以下查詢:

SELECT count(*), pg.name FROM products.product p 
LEFT JOIN products.product_group pg ON (p.product_group_id=pg.id) 
WHERE pg.id = 1 
AND p.color = 'YELLOW' 
GROUP BY pg.name 

我得到沒有結果,BU我想有:

0;"product group 1" 

如何需要更改查詢以獲得我想要的結果?

回答

2
SELECT count(p.name), pg.name 
FROM 
    products.product p 
    right JOIN 
    products.product_group pg ON 
     p.product_group_id=pg.id 
     and pg.id = 1 
     and p.color = 'YELLOW' 
GROUP BY pg.name; 
count |  name  
-------+----------------- 
    0 | product group 1 

您的原始查詢有兩個問題。首先外連接是向後的。其次,where條件將外部聯接轉換爲內部聯接,因此必須將where條件移至join條件。

計數還有另一個問題。您必須在count中聲明一列,以便只計算該列不爲空的位置。