postgresql – 在postgres中对jonined查询返回0计数

我有以下数据库模式:

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,'BLUE'); 
INSERT INTO products.product(name,'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

我没有得到任何结果,我想要:

0;"product group 1"

如何更改查询以获得我想要的结果?

解决方法

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条件移动到连接条件.

计数还有另一个问题.您必须在计数中声明一列,以便它只计算该列不为空的位置.

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...