Фон
У меня есть две таблицы с различными типами элементов обратной связи в MySQL.Я построил запрос для объединения этих таблиц по FULL OUTER JOIN
(которое фактически написано как два соединения и объединение в MySQL) и для подсчета некоторых средних оценок.Этот запрос, кажется, работает идеально:
(SELECT name, AVG(l.overallQuality) AS avgLingQual,
AVG(s.overallSatisfaction) AS avgSvcQual
FROM feedback_linguistic AS l
LEFT JOIN feedback_service AS s USING(name)
GROUP BY name)
UNION ALL
(SELECT name, AVG(l.overallQuality) AS avgLingQual,
AVG(s.overallSatisfaction) AS avgSvcQual
FROM feedback_linguistic AS l
RIGHT JOIN feedback_service AS s USING(name)
WHERE l.id IS NULL
GROUP BY name)
ORDER BY name;
(Это несколько упрощено для удобства чтения, но здесь это не имеет значения)
Проблема
Далее я попытался добавитьфильтрация по дате (т.е. учитываются только элементы обратной связи, созданные после определенной даты).С моими навыками SQL и исследованиями, которые я провел, я смог придумать следующее:
(SELECT name, AVG(l.overallQuality) AS avgLingQual,
AVG(s.overallSatisfaction) AS avgSvcQual
FROM feedback_linguistic AS l
LEFT JOIN feedback_service AS s USING(name)
WHERE (s.createdTime >= '" & date & "' OR s.createdTime IS NULL)
AND (l.createdTime >= '" & date & "' OR l.createdTime IS NULL)
GROUP BY name)
UNION ALL
(SELECT name, AVG(l.overallQuality) AS avgLingQual,
AVG(s.overallSatisfaction) AS avgSvcQual
FROM feedback_linguistic AS l
RIGHT JOIN feedback_service AS s USING(name)
WHERE l.id IS NULL
AND (s.createdTime >= '" & date & "' OR s.createdTime IS NULL)
GROUP BY name)
ORDER BY name;
Это почти работает: результаты, которые я получаю, выглядят правильно.Тем не менее, пара элементов обратной связи отсутствуют.Например, устанавливая дату месяц назад, я посчитал обратную связь для 21 разных людей в базе данных, но этот запрос возвращает только 19 человек.Хуже всего то, что я не могу найти сходства между отсутствующими элементами.
Я что-то не так делаю в этом запросе?Я думаю, что предложение WHERE
выполняет фильтрацию даты после JOIN
, и в идеале я бы, вероятно, делал это раньше.Опять же, я не знаю, вызывает ли это мою проблему, и я также не знаю, как написать этот запрос по-другому.