복붙노트

[SQL] 조건에 따라 두 번째 테이블에서 레코드의 개수와 함께 두 개의 테이블을 조인

SQL

조건에 따라 두 번째 테이블에서 레코드의 개수와 함께 두 개의 테이블을 조인

나는 테이블을 다음과 같은 한 -

여기 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)    |
+-------------+---------------+

나는 활성 제품의 수와 함께 집계 범주의 목록을 얻을 싶어요. 제품이 범주에 대한 활성없는 경우는 0을 반환해야합니다.

다소 아래 표와 같은 -

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

나는 쿼리를 다음과 같이 올라와있다 -

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;

카테고리의 각에서 활동 한 개 이상의 제품이있는 경우에만 위의 쿼리가 작동합니다. 사용 가능한 제품이없는 경우는 0으로 active_count 반환해야

나는이 문제를 어떻게 해결할 수 있습니까?

여기 SQLFIDDLE입니다

해결법

  1. ==============================

    1.사용 LEFT 대신 INNER의 조인 :

    사용 LEFT 대신 INNER의 조인 :

    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;
    

    에서 = 1 조건 p.is_active를 이동하는 것도 중요하다 WHERE ON에 절, 그래서 카테고리 테이블의 모든 레코드가 쿼리에 의해 반환됩니다.

  2. from https://stackoverflow.com/questions/36356853/join-two-tables-along-with-count-of-records-from-second-table-based-on-condition by cc-by-sa and MIT license