2016-04-01 7 views
3

に基づいて、第2のテーブルからのレコードのカウントとともに、二つのテーブルに参加 - ここは、私がテーブル次ている条件

SQLFIDDLE

カテゴリ

+-----------+-------------+ 
| column | type  | 
+-----------+-------------+ 
| id  | int(11)  | 
| name  | varchar(40) | 
| unit  | varchar(50) | 
| is_active | tinyint(1) | 
+-----------+-------------+ 

製品です

+-------------+---------------+ 
| column |  type  | 
+-------------+---------------+ 
| id   | int(11)  | 
| category_id | int(11)  | 
| name  | varchar(40) | 
| base_rate | decimal(10,2) | 
| is_active | tinyint(1) | 
+-------------+---------------+ 

アクティブな製品数のカウントとともにカテゴリのリストを取得したいと考えています。これ以上クエリはのみ動作

SELECT c.id, c.name, c.unit, COUNT(p.category_id) as active_count 
FROM `categories` c 
JOIN `products` p 
    ON c.id = p.category_id 
WHERE (p.is_active = 1) 
GROUP BY p.category_id; 

- 私は次のクエリが出ている

+----+--------+--------------+ 
| id | name | active_count | 
+----+--------+--------------+ 
| 1 | Steel |   1 | 
| 2 | Cement |   2 | 
+----+--------+--------------+ 

- 何の製品がカテゴリのアクティブでない場合には、やや下の表のように0

を返す必要がありますそれぞれのカテゴリーに少なくとも1つの製品アクティブがある場合。利用可能な製品がない場合は、active_count

と返す必要があります。ここで

ではなくINNER JOINSQLFIDDLE

+1

あなたのGROUP BYは「裏返し」です... 'GROUP BY c.id、c.name、c.uni'を実行してください。私。選択した列は集計関数の引数ではなく、group by句にリストされているはずです。 – jarlh

+0

@jarlhそうです。それを指摘していただきありがとうございます。 – Gimali

答えて

4

使用LEFT JOIN次のとおりです。

SELECT c.id, c.name, c.unit, COUNT(p.category_id) as active_count 
FROM `categories` c 
LEFT JOIN `products` p 
    ON c.id = p.category_id AND p.is_active = 1 
GROUP BY c.id; 

categoriesテーブルのすべてレコードがで返されようにONWHERE句から述語p.is_active = 1を移動することも重要ですクエリ。

+0

私は試しました。しかし、カテゴリに対してアクティブなプロダクトがない場合、そのカテゴリに対して0を返す必要があります。このクエリでは、アクティブな製品を持たないカテゴリは結果から省略されます。 – Gimali

+0

あなたはそれを釘付けにしました。 :) どうもありがとうございました。私は 'ON'節で複数の述語が許されていることは知らなかった。 – Gimali

関連する問題