我正在尝试获取相关表中某些类型记录的计数。我正在使用左连接。
因此,我有一个不太正确的查询,但返回了正确的结果。正确的结果查询具有更高的执行成本。如果我可以纠正结果,我想使用第一种方法。 (看http://sqlfiddle.com/#!15/7c20b/5/2 http://sqlfiddle.com/#!15/7c20b/5/2)
CREATE TABLE people(
id SERIAL,
name varchar not null
);
CREATE TABLE pets(
id SERIAL,
name varchar not null,
kind varchar not null,
alive boolean not null default false,
person_id integer not null
);
INSERT INTO people(name) VALUES
('Chad'),
('Buck'); --can't keep pets alive
INSERT INTO pets(name, alive, kind, person_id) VALUES
('doggio', true, 'dog', 1),
('dog master flash', true, 'dog', 1),
('catio', true, 'cat', 1),
('lucky', false, 'cat', 2);
我的目标是找回一张桌子,上面有所有的人以及他们所养宠物的种类:
| ID | ALIVE_DOGS_COUNT | ALIVE_CATS_COUNT |
|----|------------------|------------------|
| 1 | 2 | 1 |
| 2 | 0 | 0 |
我把这个例子变得更简单了。在我们的生产应用程序(不是真正的宠物)中,每人大约有 100,000 只死狗和猫。我知道这很糟糕,但这个例子更容易转发;)我希望在计数之前过滤掉所有“死”的东西。我现在在生产中的查询速度较慢(来自上面的 sqlfiddle),但希望 LEFT JOIN 版本能够正常工作。