내 급우와 나는이 쿼리가 올바르게 작동하도록 만연하고 있습니다.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 |
+----------+--------+-----------------+-------------+
너희들이 크게 감사하겠습니다 제공 할 수있는 어떤 도움. 왜 이것이 작동하지 않는지 전혀 알 수 없습니다.
감사합니다 !!!
'UNION', 'LEFT JOIN'및 'RIGHT JOIN'보다는 'FULL JOIN'을 사용하는 것이 좋습니다. – Nicarus
MySQL은 전체 조인을 지원하지 않습니다. –
방금 테스트를했는데 잘못된 행을 확인할 수 없습니다. 테스트 환경에서 다른 예제 데이터가 있다고 생각합니다. –