我的db中有一个这样的表:
id --- owner --- product ---- type
0 --- john --- mustang ---- car
1 --- tim --- a360 ---- plane
2 --- john --- camry ---- car
3 --- dan --- a380 ---- plane
4 --- tim --- ninja ---- bike
5 --- dan --- accord ---- car
我正在尝试获取所有者拥有的每种类型的数量。像这样:
John
Car = 2
Plane = 0
Bike = 0
-------------
Tim
Car = 0
Plane = 1
Bike = 1
-------------
Dan
Car = 1
Plane = 1
Bike = 0
-------------
我一直无法解决这个问题。
另一个问题是我的数据库能够接受新类型。例如,有人可以添加自行车作为一种类型。
有没有办法做到这一点?
答案 0 :(得分:1)
我接近这个的方式有点棘手。
我首先创建了一个使用笛卡尔积的结果集,为每个人获取一行并输入组合。
SELECT m.owner, t.type
FROM myTypes t, myTable m
GROUP BY m.owner, t.type
然后,我创建了另一个结果集,它抓住了所有者的每个类型的所有者,类型和数量。但是,这仅返回现有所有者类型组合的行。它不会返回任何值,因为约翰'和' Plane'因为他没有平面产品。
SELECT m.owner, t.type, COUNT(*) as numOfType
FROM myTypes t
JOIN myTable m ON t.type = m.type
GROUP BY t.type, m.owner;
最后,我使用外连接将这两个表连接在一起,因此我收到了所有者类型组合表中的每一行。当然,有些行为计数返回null,所以我必须使用IFNULL
将它们替换为0.这与您问题中的结果集匹配。
SELECT w1.owner, w1.type, IFNULL(w2.numOfType, 0) AS numOfType
FROM (SELECT m.owner, t.type
FROM myTypes t, myTable m
GROUP BY m.owner, t.type) w1
LEFT JOIN (SELECT m.owner, t.type, COUNT(*) as numOfType
FROM myTypes t
JOIN myTable m ON t.type = m.type
GROUP BY t.type, m.owner) w2
ON w1.owner = w2.owner AND w1.type = w2.type;
这是SQL Fiddle。
答案 1 :(得分:0)
要解决此问题,首先必须生成输出行,然后获取计数:
select o.owner, p.product, count(t.owner)
from (select distinct owner from table) o cross join
(select distinct product from table) p left join
table t
on t.owner = o.owner and t.product = p.product
group by o.owner, p.product;
如果您拥有所有者和产品的参考表,那么您可以使用这些参数表而不是select distinct
子查询。
编辑:
按类型分组基本相同:
select o.owner, ty.type, count(t.owner)
from (select distinct owner from table) o cross join
(select distinct type from table) ty left join
table t
on t.owner = o.owner and t.type = ty.type
group by o.owner, ty.type;