Двойное соединение с одним столом дважды
173 просмотра
1 ответ
У меня есть небольшая проблема с запросом, где я бы сделал двойное соединение с одной и той же таблицей дважды. У меня есть эти 2 таблицы:
list_couples
|id |p_1 |p_2|
|1 |Topolino |Minnie|
|2 |Pippo |Pluto|
|3 |Paperino |Paperone|
rank
|year |week |player |points
|2015 |1 |Paperino |200
|2015 |1 |Pippo |100
|2015 |1 |Paperone |50
|2015 |1 |Topolino |30
|2015 |1 |Minnie |30
|2015 |2 |Paperino |300
|2015 |2 |Pippo |150
|2015 |2 |Paperone |50
|2015 |2 |Pluto |40
Я бы упорядочил пары (p_1 и p_2) в таблице list_couples, уменьшив сумму очков двух игроков на неделю в году.
Когда игроки пары находятся в таблице рангов обоих, мой запрос работает, но если один или оба не находятся в таблице рангов, это не так, как в примере на первой неделе, где Плутон не находится в таблице рангов на первой неделе.
Это мой запрос:
SELECT i.*, r.*, r2.*,
r.points + r2.points AS sum_points
FROM list_couples AS l
LEFT JOIN rank AS r ON l.p_1=r.player
LEFT JOIN rank AS r2 ON l.p_2=r2.player
WHERE r.week='$week' AND r.year='$year' AND
r2.week='$week' AND r2.year='$year'
ORDER BY sum_points DESC
С этим решением я получаю этот результат
|3 |Paperino |Paperone |2015 |1 |300 |2015 |1 |50 |350
|1 |Topolino |Minnie |2015 |1 |30 |2015 |1 |30 |60
вместо этого
|3 |Paperino |Paperone |2015 |1 |300 |2015 |1 |50 |350
|2 |Pippo |Pluto |2015 |1 |100 |2015 |1 |NULL |100
|1 |Topolino |Minnie |2015 |1 |30 |2015 |1 |30 |60
Как я могу решить?
Автор: Mr Ball Источник Размещён: 13.11.2019 11:35Ответы (1)
1 плюс
Ограничения условия where в левых таблицах объединения исключают желаемые результаты из-за нулевых записей ... Поэтому переместите ограничения в само соединение, чтобы ограничение применялось ДО соединения, таким образом сохраняя записи с нулевым значением.
SELECT i.*,r.*,r2.*, r.points+r2.points AS sum_points
FROM list_couples AS l
LEFT JOIN rank AS r ON l.p_1=r.player
and r.week='$week' AND r.anno='$anno'
LEFT JOIN rank AS r2 ON l.p_2=r2.player
and r2.week='$week' AND r2.anno='$year'
ORDER BY sum_points DESC
Поскольку у плутона нет недели / года (anno), предложение where удаляет эту запись. при перемещении ограничений на объединение фильтр применяется до возникновения объединения, сохраняя тем самым ЛЕВОЕ внешнее объединение.
Другими словами, пункт WHERE заставляет левых присоединиться к внутреннему!
Автор: xQbert Размещён: 24.11.2015 10:08Вопросы из категории :
- mysql Двоичные данные в MySQL
- mysql Насколько большой может быть база данных MySQL до того, как производительность начнет снижаться
- mysql Выбрать все столбцы, кроме одного в MySQL?
- mysql MySQL или PDO - каковы плюсы и минусы?
- mysql Как выбрать n-ую строку в таблице базы данных SQL?
- mysql MyISAM против InnoDB
- mysql Обмен значениями столбца в MySQL
- mysql Есть ли способ увидеть ход выполнения инструкции ALTER TABLE в MySQL?
- mysql MySQL Error 1093 - Can't specify target table for update in FROM clause
- mysql Как я могу предотвратить SQL-инъекцию в PHP?
- mysql Как быстро переименовать базу данных MySQL (изменить имя схемы)?
- mysql Получил ошибку 122 из механизма хранения
- mysql Простой способ экспортировать таблицу SQL без доступа к серверу или phpMyADMIN
- mysql mysqldump | mysql выдает ошибку «слишком много открытых файлов». Зачем?
- mysql Ошибка MySQL 1153 - Получен пакет, размер которого превышает байты max_allowed_packet
- mysql Как создать индекс в части даты поля DATETIME в MySql
- mysql Какое наилучшее решение для пула соединений с базой данных в python?
- mysql Активный флаг или нет?
- mysql Запустите MySQLDump без таблиц блокировки
- mysql Как восстановить файл дампа из mysqldump?