잘못된 결과를주는 쿼리가 있습니다.SQL 쿼리에서 "잘못된"조인을 사용합니다.
테이블 :
A
+----+
| id |
+----+
| 1 |
| 2 |
+----+
B
+----+----+
| id | x | B.id = A.id
+----+----+
| 1 | 1 |
| 1 | 1 |
| 1 | 0 |
+----+----+
C
+----+----+
| id | y | C.id = A.id
+----+----+
| 1 | 1 |
| 1 | 2 |
+----+----+
내가하고 싶은 것 : B의 카운트의 각 행에 대해 A. 모든 행을 선택 B.id = A와 값 0 값 1 모든 x와 모든 X .신분증. A의 각 행에 대해 C.id = A.id로 C에서 최소 y를 얻습니다.
내가 기대하고 결과는 다음과 같습니다
+----+------+--------+---------+
| id | min | count1 | count 2 |
+----+------+--------+---------+
| 1 | 1 | 2 | 1 |
| 2 | NULL | 0 | 0 |
+----+------+--------+---------+
의 첫 번째 시도는 : 이 작동하지 않습니다.
SELECT a.id,
MIN(c.y),
SUM(IF(b.x = 1, 1, 0)),
SUM(IF(b.x = 0, 1, 0))
FROM a
LEFT JOIN b
ON (a.id = b.id)
LEFT JOIN c
ON (a.id = c.id)
GROUP BY a.id
+----+------+--------+---------+
| id | min | count1 | count 2 |
+----+------+--------+---------+
| 1 | 1 | 4 | 2 |
| 2 | NULL | 0 | 0 |
+----+------+--------+---------+
두 번째 시도 : 이 작동하지만 난 그게 나쁜 성능을 확신합니다.
SELECT a.id,
MIN(c.y),
b.x,
b.y
FROM a
LEFT JOIN (SELECT b.id, SUM(IF(b.x = 1, 1, 0)) x, SUM(IF(b.x = 0, 1, 0)) y FROM b) b
ON (a.id = b.id)
LEFT JOIN c
ON (a.id = c.id)
GROUP BY a.id
+----+------+--------+---------+
| id | min | count1 | count 2 |
+----+------+--------+---------+
| 1 | 1 | 2 | 1 |
| 2 | NULL | 0 | 0 |
+----+------+--------+---------+
마지막 시도 : 이 방법도 효과적입니다.
SELECT x.*,
SUM(IF(b.x = 1, 1, 0)),
SUM(IF(b.x = 0, 1, 0))
FROM (SELECT a.id,
MIN(c.y)
FROM a
LEFT JOIN c
ON (a.id = c.id)
GROUP BY a.id) x
LEFT JOIN b
ON (b.id = x.id)
GROUP BY x.id
이제 내 질문은 : 마지막 하나는 최선의 choise 아니면 하나의 select 문이 쿼리를 작성하는 방법 (첫 번째 시도에서처럼)이 있습니까?
RBDMS는 무엇입니까? MySQL, PostgreSQL? –
데이터베이스를 MySQL로 사용합니다. – KN4CK3R