2016-11-18 1 views
1

내 급우와 나는이 쿼리가 올바르게 작동하도록 만연하고 있습니다.MySQL Left Join Right 오른쪽 join union이 잘못된 데이터를 반환합니다.

목표 : 왼쪽 조인과 오른쪽 조인을 통해 완전히 조인 된 두 개의 테이블로 구성된 단일 테이블을 반환합니다. Null 값이 있습니다. 이 표의 목적은 속도가 왼쪽 Y 축에 속도와 무게를 오른쪽 Y 축에 그래프로 표시하여 무게가 속도와 일치하는 방식을 추적하는 것입니다. 일부 값은 날짜가 공유됩니다.

가정 :

  • 플레이어는 하루에 체중 여러 번 기록 할 수 없습니다.
  • 플레이어는 하루에 여러 번의 스프린트 속도 항목을 가질 수 없습니다.
  • 날짜는 스프린트 값 또는 가중치와 별개로 존재할 수 없습니다. 그들은 그것과 관련된 값 중 적어도 하나를 가지고 있어야합니다.

일 문제 : 그들은 NULL 대신해야 할 때 여러 행의 값을 반환하고, 우리는이 데이터에서 오는 단서가 없다.

현재 잘못된 쿼리

SELECT weight.username, weight.weight, metric.speedOrDistance, weighInDate 
FROM playerweight as weight LEFT JOIN sprint AS metric ON 
weight.weighInDate = metric.workoutDate 
WHERE weight.username = 'testuser' 
UNION 
SELECT metric.username, weight.weight, 
metric.speedOrDistance, workoutDate 
FROM playerweight as weight RIGHT 
JOIN sprint AS metric ON weight.weighInDate = metric.workoutDate 
WHERE metric.username = 'testuser' 
ORDER BY weighInDate; 

데이터 예 :

프린트 표

+----------+-------------+-----------------+ 
| username | workoutDate | speedOrDistance | 
+----------+-------------+-----------------+ 
| jdoe  | 2016-10-10 |   2.00 | 
| jdoe  | 2016-10-17 |   3.50 | 
| jdoe  | 2016-10-24 |   3.00 | 
| jdoe  | 2016-11-01 |   5.00 | 
| jdoe  | 2016-11-10 |   4.00 | 
| foo  | 2016-11-03 |   2.50 | 
| foo  | 2016-11-14 |   5.00 | 
| foo  | 2016-11-16 |   4.00 | 
| foo  | 2016-11-18 |   3.00 | 
| testuser | 2016-10-11 |   3.40 | 
| testuser | 2016-10-17 |   3.40 | 
| testuser | 2016-11-13 |   1.50 | 
| testuser | 2016-11-15 |   2.00 | 
| testuser | 2016-11-17 |   4.00 | 
+----------+-------------+-----------------+ 

playerWeight

+----------+-------------+--------+ 
| username | weighInDate | weight | 
+----------+-------------+--------+ 
| jdoe  | 2016-10-10 | 160 | 
| jdoe  | 2016-10-17 | 160 | 
| jdoe  | 2016-10-24 | 170 | 
| jdoe  | 2016-11-01 | 180 | 
| jdoe  | 2016-11-08 | 180 | 
| jdoe  | 2016-11-09 | 200 | 
| jdoe  | 2016-11-11 | 178 | 
| jdoe  | 2016-11-22 | 195 | 
| foo  | 2016-11-01 | 190 | 
| foo  | 2016-11-10 | 185 | 
| foo  | 2016-11-14 | 175 | 
| foo  | 2016-11-18 | 180 | 
| bar  | 2011-01-16 | 170 | 
| bar  | 2011-07-16 | 177 | 
| bar  | 2011-09-16 | 169 | 
| testuser | 2016-11-04 | 150 | 
| testuser | 2016-11-08 | 200 | 
| testuser | 2016-11-11 | 195 | 
| testuser | 2016-11-14 | 175 | 
| testuser | 2016-11-17 | 180 | 
+----------+-------------+--------+ 

잘못된 결과 표

+----------+--------+-----------------+-------------+ 
| username | weight | speedOrDistance | weighInDate | 
+----------+--------+-----------------+-------------+ 
| testuser | NULL | 3.4    | 2016-10-11 | 
| testuser | 160 | 3.4    | 2016-10-17 | -- ERROR ROW, weight should not have a value 
| testuser | 150 | NULL   | 2016-11-04 | 
| testuser | 200 | NULL   | 2016-11-08 | 
| testuser | 195 | NULL   | 2016-11-11 | 
| testuser | NULL | 1.5    | 2016-11-13 | 
| testuser | 175 | 5    | 2016-11-14 | -- ERROR ROW, speedOrDistance should not have a value 
| testuser | NULL | 2    | 2016-11-15 | 
| testuser | 180 | 4    | 2016-11-17 | 
+----------+--------+-----------------+-------------+ 

이상적인 결과 테이블

+----------+--------+-----------------+-------------+ 
| username | weight | speedOrDistance | weighInDate | 
+----------+--------+-----------------+-------------+ 
| testuser | NULL | 3.4    | 2016-10-11 | 
| testuser | NULL | 3.4    | 2016-10-17 | 
| testuser | 150 | NULL   | 2016-11-04 | 
| testuser | 200 | NULL   | 2016-11-08 | 
| testuser | 195 | NULL   | 2016-11-11 | 
| testuser | NULL | 1.5    | 2016-11-13 | 
| testuser | 175 | NULL   | 2016-11-14 | 
| testuser | NULL | 2    | 2016-11-15 | 
| testuser | 180 | 4    | 2016-11-17 | 
+----------+--------+-----------------+-------------+ 

너희들이 크게 감사하겠습니다 제공 할 수있는 어떤 도움. 왜 이것이 작동하지 않는지 전혀 알 수 없습니다.

감사합니다 !!!

+1

'UNION', 'LEFT JOIN'및 'RIGHT JOIN'보다는 'FULL JOIN'을 사용하는 것이 좋습니다. – Nicarus

+0

MySQL은 전체 조인을 지원하지 않습니다. –

+0

방금 ​​테스트를했는데 잘못된 행을 확인할 수 없습니다. 테스트 환경에서 다른 예제 데이터가 있다고 생각합니다. –

답변

3

workoutDate = weighInDate에서 조인을 수행합니다. 결과 세트에 남아있는 관련이없는 행의 조합을 사용자 이름과 상관없이 조합 할 수 있습니다.

이 문제를 해결하려면 날짜와 사용자 이름 모두에 가입해야합니다.

LEFT JOIN sprint AS metric ON weight.weighInDate = metric.workoutDate 
           and weight.username = metric.username 

마찬가지로 오른쪽 가입하십시오. 이 문제의 원인을 설명하는 데 도움이 있기 때문에


대답에 추가되었습니다. @OlafDietsche가 올바른 해결책을 가지고 있습니다. 실제 잘못된 데이터의 출처를 확인하기 만하면됩니다.당신은 단지 날짜에 합류하기 때문에
| testuser | 2016-10-17 |   3.40 

이 레코드

| jdoe  | 2016-10-17 | 160 | 

에 합류 :

는 당신에게 당신의 가입이 레코드의 문제를 표시합니다.