MySQL JOIN + WHERE + GROUP BY

Вы могли бы сделать:

def func(n=5.0, delta=None):
    if delta is None:
        delta = n / 10
    ...
0
задан DSB 16 January 2019 в 19:43
поделиться

2 ответа

Условие «t.status = 0» в предложении WHERE отрицает «внешность» соединения; тот же результат, который мы получили бы с ВНУТРЕННИМ СОЕДИНЕНИЕМ.

При внешнем соединении любые строки в locations, которые не имеют совпадающей строки в turns, будут возвращены со значениями NULL для всех столбцов t.. Несоответствующие строки из locations будут исключены условием в предложении WHERE.


Рассмотрите возможность перемещения этого условия из условия WHERE в предложение ON внешнего соединения.

Или рассмотрите возможность перемещения этого условия в совокупное выражение.

В качестве примера:

SELECT l.id
     , l.zipcode
     , SUM(IF(t.status = 0, 1, 0)) AS turns
     , SUM(IF(t.status = 0 AND t.itemspurchased > 0, t.itemspurchased, 0)) AS items
 FROM locations l

 LEFT 
 JOIN turns t
   ON t.locationid = l.id
  AND t.status     = 0 

WHERE l.zipcode = XXXX 
GROUP
   BY l.id
    , l.zipcode
0
ответ дан spencer7593 16 January 2019 в 19:43
поделиться

Использование левого соединения и расстановка критериев в разных местах.

Чтобы избежать этого, используя критерии в предложении WHERE для таблицы LEFT JOIN'd, это дало бы эффект, как если бы оно было INNER JOIN.

SELECT 
loc.ZIPCode,
COUNT(DISTINCT CASE turns.status WHEN 0 THEN turns.id END) AS turns,
SUM(CASE 
    WHEN turns.status = 1 AND turns.itemsPurchased > 0 
    THEN turns.itemsPurchased 
    ELSE 0 
    END) AS items
FROM locations loc
LEFT JOIN turns ON turns.locationId = loc.id
WHERE loc.ZIPCode = 12345
GROUP BY loc.id, loc.ZIPCode
0
ответ дан LukStorms 16 January 2019 в 19:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: