2016-02-14 78 views
0

我有一個名爲products的表,我的查詢從它中檢索不同的和分組的行,按product_type_id分組。
這是查詢,和它的作品加入查詢,根據列的組數和子計數

SELECT p.*, count(p.id) as count, pt.name from products p 
LEFT JOIN product_types pt on pt.id = p.product_type_id 
where client_id = 777 
group by product_type_id 

但是,這還不夠,我想通過activated柱(布爾型)子數和未啓動的列。

我想獲得每行,設置爲true的產品的子計數以及設置爲false的產品。我想把它們作爲相關行中的另一列。

是否有可能?

+0

樣本數據有助於傳達您正在做的事情。 –

+0

@GordonLinoff嗨,我看不出它會如何幫助..(我現在要加一些) – yossi

回答

1

如果您使用的是BIT類型,您可能需要澆鑄成一個整數這一點。

我會建議一個CASE選擇語句或子選擇。

活化

sum(CAST(activated as INT)) as TotalActivated 

(select sum(CAST(activated as INT)) FROM products WHERE product_type_id = p.product_type_id) as TotalActivated 

未激活

sum(case when activated = 1 then 0 else 1 end) as NotActivated 

(select sum(case when activated = 1 then 0 else 1 end) FROM products WHERE product_type_id = p.product_type_id) as NotActivated 
1

如果你想用的activated計數一個單獨的列,那麼你可以使用條件彙總:

select p.*, count(p.id) as count, pt.name, 
     SUM(activated) as numActivated, 
     (COUNT(*) - SUM(activated)) as numNotActivated 
from products p left join 
    product_types pt 
    on pt.id = p.product_type_id 
where client_id = 777 
group by product_type_id; 

的MySQL把布爾在數值上下文整數,1爲真,0表示假。所以,你可以添加值來獲得計數。

編輯:

如果你想分開行,然後將其包含在GROUP BY

select p.*, activated, count(p.id) as count, pt.name 
from products p left join 
    product_types pt 
    on pt.id = p.product_type_id 
where client_id = 777 
group by product_type_id, activated; 
+0

謝謝。我不明白如何得到「未激活」,因爲總和爲0 ...(PHP中的o/c可以用數學計算,但可以用SQL來完成) (現在我看到了我只問了激活的,抱歉) – yossi