2016-11-18 1 views
1

Мои одноклассники и я были безуспешно пытались заставить этот запрос работать правильно.MySQL Left Join Right Объединение объединения возвращает неверные данные

Цель: Вернуть единую таблицу, состоящую из двух таблиц, полностью соединенных с помощью левого соединения, а затем правого соединения. Будут нулевые значения. Цель этой таблицы - рассчитать скорость и вес со скоростью на левой оси Y и весом по правой оси Y, чтобы отслеживать, как вес совпадает со скоростью. Некоторые значения будут иметь общие даты.

В Предположения:

  • Игрок не может записать их вес несколько раз в день.
  • Игрок не может иметь несколько записей скорости спринта в течение одного дня.
  • Дата не может существовать независимо от AT LEAST значение спринта ИЛИ вес. Они должны иметь ПОСЛЕДНИЕ одно из значений, связанных с ним.

выпуска: Несколько строк возвращаются значения, когда они должны быть 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 | 
+----------+--------+-----------------+-------------+ 

Ideal Таблица результатов

+----------+--------+-----------------+-------------+ 
| 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 | 
+----------+--------+-----------------+-------------+ 

Любая помощь, которую вы, ребята могли бы предложить было бы весьма признателен. Мы не знаем, почему это не работает.

Thank you !!!

+1

Похоже, вам было бы лучше использовать 'FULL JOIN', а не' UNION', 'LEFT JOIN' и' RIGHT 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 | 

, потому что вы только вступили на сегодняшний день.