查询以获取项目出现的次数

时间:2014-10-26 20:31:37

标签: php mysql group-by

我的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
-------------

我一直无法解决这个问题。

另一个问题是我的数据库能够接受新类型。例如,有人可以添加自行车作为一种类型。

有没有办法做到这一点?

2 个答案:

答案 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;