2011-03-16 30 views
8
aşağıdaki sorguda Yani

seçme sayımı

SELECT count(*) 
FROM company c 
JOIN product p on c.id = product.company_id 
WHERE p.is_deleted = 0 
AND c.is_customer = 1 
AND c.company_type_id = 5 
GROUP by c.id 

en az bir ürün var şirketlerinin sayısını saymak için çalışıyorum

, bu bana tüm şirketlerin bir listesini gösterir MySQL, ve her biri için ürünlerin sayımı şirket.

Neyi başarmaya çalıştığım, yukarıdaki sonuçlardan şirketlerin sayısıdır. aşağıdaki gibi

Bu

elde edilebilir:
SELECT count(*) 
FROM ( 
    SELECT count(*) 
    FROM company c 
    JOIN product p on c.id = product.company_id 
    WHERE p.is_deleted = 0 
    AND c.is_customer = 1 
    and c.company_type_id = 5 
    GROUP by c.id) AS t1 

Yani, bu bana doğru sonucu verir, ama şeyler yapmanın daha verimli bir yolu yoktur diye merak ediyorum.

+0

burada bulman oldukça iyi bir iş yapmış gibi görünüyor. Gerçekten performans sorunları yaşadıkça iyileşme için yer göremiyorum – BigFatBaby

+0

Şüphesiz yukarıdaki sorgu her zaman 1'e dönecek ?! Tek bir alan döndüren bir COUNT (*) 'a sahip olursunuz, daha sonra tek bir alan için tekrar COUNT (*)' dediğinizde ... Bir şeyi özlüyor muyum? – anothershrubery

+0

@another: iç sayı (*) bir 'grup by' - her şirket başına bir sayı döndürür – Blorgbeard

cevap

9

Bunu bir basitleştirmeye inanıyorum:

SELECT count(distinct c.id) 
FROM company c 
JOIN product p on c.id = product.company_id 
WHERE p.is_deleted = 0 
AND c.is_customer = 1 
AND c.company_type_id = 5 
+0

Sadece burada farklı şirketleri saymıyor musunuz? Şirket başına ayrı ürünler değil mi? – anothershrubery

+0

@another Sorunun en az bir ürüne sahip firma sayısı - bu soruyor ne olduğunu düşünüyorum. – Blorgbeard

+0

@anothershrubery: Sorgu, sonuçta kaç tane benzersiz şirket kimliğinin bulunduğunu ve sonuç yalnızca en az bir ürüne sahip olan şirketlere filtre uygulanacak. çok iyi bir iş @Blorgbeard - beklemede kaldım – BigFatBaby