2014-10-26 45 views
0

的次数我有一个这样的表在我的分贝:查询来获取一个项目出现

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

我有点困惑,OP。被接受的答案不能给出你所期望的结果集。你究竟在寻找什么? – AdamMc331 2014-10-26 21:44:40

回答

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; 
+0

这不会给OP找到的结果集。 – AdamMc331 2014-10-26 21:08:03

+0

@ McAdam331。 。 。首先,以什么方式?其次,OP接受了答案。 – 2014-10-27 02:56:18

+0

OP要求他们按类型分组,而不是产品。我不能说OP为什么接受这个,因为它与他们要求的不一致,所以我不知道OP在这里真的想要什么。 – AdamMc331 2014-10-27 02:57:51

1

我走近这是一个有点棘手的方式。

我开始创建一个结果集,使用笛卡尔积为每个人和类型组合获得一行。

SELECT m.owner, t.type 
FROM myTypes t, myTable m 
GROUP BY m.owner, t.type 

然后,我做了另一个结果集,抓住了所有者的所有者,类型和每种类型的数量。但是,这仅返回现有所有者类型组合的行。它不会返回说'约翰'和'飞机'的任何价值,因为他没有飞机产品。

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