MySQL - 选择具有多个表的不同计数

时间:2013-11-22 01:56:37

标签: mysql sql count distinct analytics

我在使用MySQL查询时遇到问题,无法使用特定软件版本生成产品数量报告。

这是我的问题:

SELECT Count(ps.software_id) AS count, 
       s.software_id 
FROM   software s, 
       product_software ps, 
       products p 
WHERE  s.software_id = ps.software_id 
       AND p.product_id = ps.product_id 
       AND p.product_name = 'ProdA' 
GROUP  BY ps.software_id 

麻烦的是,product_software表看起来像这样:

product_software_id        product_id          software_id
1                          1                   1
2                          2                   1
3                          3                   1
4                          1                   2
5                          2                   2
6                          1                   3
7                          4                   3
8                          5                   3

查询的当前输出是:

count       software_id
3           1
2           2
3           3

正确(预期)输出应为:

count       software_id
0           1
1           2
3           3

我只想在查询中包含最新(最高的product_software_id)条目。 (即software_id和product_id都应该是唯一的。)

3 个答案:

答案 0 :(得分:2)

要获得特定产品的最高product_software_id,您必须先加入2个product_software表来过滤最后一个(您可以创建一个名为v_product_software的视图)

Select p1.* from product_software p1 left join product_software laster on p1.product_id = laster.product_id and p1.product_software_id < laster.product_software_id
where isnull(laster.product_software_id)

- &GT;此查询返回

product_software_id        product_id          software_id
3                          3                   1
5                          2                   2
6                          1                   3
7                          4                   3
8                          5                   3

之后,运行你的sql将返回(将product_software更改为v_product_software)

count       software_id
0*          1
1           2
3           3

对于第1行,software_id = 1将包含id = 3的产品,但我认为产品名称与'ProdA'不同,因此结果将为0而不是1.

答案 1 :(得分:1)

谢谢你们,我找到了答案。这就是它可以帮助任何人前进:

select Count(counted) as count, software_id 
from (select  Max(ps.software_id) as counted,
Max(s.software_id) software_id,
from software s
inner join product_software ps
on s.software_id = ps.software_id
inner join products p  
on p.product_id = ps.product_id
where p.product_name='ProdA'
group by p.product_id
) as counts
group by counted

答案 2 :(得分:0)

要获得每种产品的最高版本,只需按产品分组即可。

Select product_id, max(software_id)
  From product_software
  group by product_id

由此,按软件ID计算产品。

with v as
( select product_id, max(software_id) curr_ver
    from product_software
    group by product_id
)
select count(*), curr_ver
  from v
  group by curr_ver
  order by curr_ver