2013-11-22 2 views
1

У меня возникли проблемы с запросом MySQL для создания отчета о количестве продуктов с использованием определенной версии программного обеспечения.MySQL - выберите Distinct Count с несколькими таблицами

Вот мой запрос:

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 должны быть уникальными).

+1

Вы можете добавить данные примеры в вашей product_software таблицы, чтобы проиллюстрировать другие сценарии, например, тот, где желаемое количество должно быть 2? – WarrenT

+0

@WarrenT отредактировано – Paul

+0

Можете ли вы объяснить, почему ваши ожидаемые списки результатов count = 3 для software_id = 3, а для других count = 1. Каковы правила? – cha

ответ

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) 

- возвращение> этот запрос

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.

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

Это не будет летать с 'WITH'. MySQL не поддерживает поддержку CTE. – peterm

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 
Смежные вопросы