[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.사용 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에 절, 그래서 카테고리 테이블의 모든 레코드가 쿼리에 의해 반환됩니다.
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
'SQL' 카테고리의 다른 글
[SQL] Oracle- 분할 문자열 쉼표 (문자열에 공백이 연속 쉼표를 포함)로 구분 (0) | 2020.06.16 |
---|---|
[SQL] ORA-00933은 : SQL이 제대로 종료되지] 명령 (0) | 2020.06.16 |
[SQL] 메모리 2005 / SQL C #에서 BLOB 데이터를 읽을 수있는 효과적인 방법 (0) | 2020.06.16 |
[SQL] PHP / MySQL을 매김 (0) | 2020.06.16 |
[SQL] 나는 하나 개의 SQL 쿼리의 SQL 서버 수 () 행을받을 수 있나요? (0) | 2020.06.16 |