2015-12-21 123 views
0

我有3个表:PostgreSQL的选择查询不起作用

CREATE table materials 
(id serial primary key not null, 
name varchar(50) not null, 
unit varchar(10) not null default 'шт', 
price decimal(12, 2) not null check (price>0)); 

CREATE table warehouses 
(id serial primary key not null, 
lastname varchar(25) not null); 

CREATE table materials_in_warehouses 
(id_warehouses integer references warehouses(id) on update cascade on delete cascade, 
id_materials integer references materials(id), 
unit varchar(15) default 'шт', 
count integer not null CHECK (count>0), 
lastdate date not null, 
primary key (id_warehouses, id_materials); 

,我需要为每种材料选择:名字;仓库的计数,其中材料存在于我试图做这样的事情的> 100

量:

select materials.name, count(select * from materials_in_warehouses where 
materials.id = materials_in_warehouses.id_materials AND material_in_warehouses.count > 100) as sount from materials; 

当然不过,这种废话不能工作。

预先感谢您。

+0

您的代码有错误或... – ashkufaraz

+0

类型'materials.id'是串行的而'materials_in_warehouses.id_materials'是整数!? – ashkufaraz

+0

@ashkufaraz序列就像mysql中的auto_increment。这是一个整数,但带有自动增量。它仍然是整数。 – AlexanderMP

回答

1

漂亮的直线前进。

SELECT m.name, count(miw.id_warehouses) 
FROM materials m 
LEFT JOIN materials_in_warehouses miw ON m.id=miw.id_materials AND miw."count">100 
GROUP BY m.id, m.name 

你的错误可能是刚刚您使用count为列名,当它是一个聚合函数的事实。使用在PostgreSQL双引号为: Escaping keyword-like column names in Postgres

+0

工作良好,但为什么不输出材料,其中仓库数= 0? – Birthright

+0

您正在测试更新的版本吗?在我昨天回答之后,我意识到它的行为会如此,所以我取消了WHERE子句,并将条件移入了LEFT JOIN。 – AlexanderMP

+0

哦,对不起。更新的版本效果很好。 – Birthright

0

尝试这样

select materials.name, count(
select id_warehouses from materials_in_warehouses join materials 
on materials.id = materials_in_warehouses.id_materials 
where material_in_warehouses.count > 100 
) as sount from materials; 
0
SELECT m.name, COUNT(w.id) AS locs 
    FROM materials m, warehouses w, materials_in_warehouses mw 
    WHERE m.id = mw.id_materials 
    AND w.id = mw.id_warehouses 
    AND mw.count > 100 
    GROUP BY m.name; 

如果这样的作品,我会回来,并解释我是如何想出了它。