Вопрос:

Двойное соединение с одним столом дважды

mysql

173 просмотра

1 ответ

8 Репутация автора

У меня есть небольшая проблема с запросом, где я бы сделал двойное соединение с одной и той же таблицей дважды. У меня есть эти 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 Источник Размещён: 24.11.2015 10:01

Ответы (1)


1 плюс

30809 Репутация автора

Решение

Ограничения условия 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
Вопросы из категории :
32x32