#mysql #subquery
#mysql #подзапрос
Вопрос:
Я пишу запрос для создания графика на основе статистики за 7 дней. newpost
И closedpost
работают нормально, но я получаю subquery returns more than one row
, когда пытаюсь настроить квалификатор, например, WHERE closed IS NOT NULL AND (sent = 0 OR sent =1) AND created >= DATE(NOW()) - INTERVAL 7 DAY GROUP BY DATE(created))
для отображения solvedpost
. Я не уверен, как заставить это работать. Любая помощь будет оценена
мой запрос:
SELECT
DATE(created) newpostdate,
COUNT(DISTINCT created) newpost,
COUNT(DISTINCT closed) closedpost,
(SELECT
COUNT(DISTINCT closed)
FROM
tickets
WHERE
closed IS NOT NULL
AND (sent = 0 OR sent = 1)
AND created >= DATE(NOW()) - INTERVAL 7 DAY
GROUP BY DATE(created)) solvedpost
FROM
tickets
WHERE
created >= DATE(NOW()) - INTERVAL 7 DAY
GROUP BY DATE(created);
Комментарии:
1. запрос с
GROUP BY DATE(created)
return count() для каждого дня. т.е. несколько строк. измените условие, чтобы получить только одну строку2. Могу ли я предложить вам отправить некоторые фиктивные данные в той же структуре, которую использует ваша таблица, и результат, который вы ожидаете от запроса? Такой вопрос, как есть, я могу только сказать, что вам нужно будет указать псевдоним для tickets снаружи и другой псевдоним для tickets внутри подзапроса и как-то связать обе коллекции — и если подзапрос действительно лучший вариант.
Ответ №1:
Используйте условную агрегацию:
SELECT
DATE(created) newpostdate,
COUNT(DISTINCT created) newpost,
COUNT(DISTINCT closed) closedpost,
COUNT(DISTINCT
CASE WHEN closed IS NOT NULL AND (sent = 0 OR sent = 1)
THEN closed END
) solvedpost
FROM
tickets
WHERE
created >= DATE(NOW()) - INTERVAL 7 DAY
GROUP BY DATE(created);
Вам даже не нужно closed IS NOT NULL
условие, потому что нули просто не учитываются.
Это основано на вашем исходном запросе. Но я думаю, вам не следует использовать DISTINCT
. Если вы решите не использовать DISTICT
ваш запрос может быть:
SELECT
DATE(created) newpostdate,
COUNT(created) newpost,
COUNT(closed) closedpost,
SUM(closed IS NOT NULL AND (sent = 0 OR sent = 1)) solvedpost
FROM
tickets
WHERE
created >= DATE(NOW()) - INTERVAL 7 DAY
GROUP BY DATE(created);
Комментарии:
1. Спасибо, это то, что я искал, и ваше правильное представление о distinct. Для меня это предварительный запрос, и я пытаюсь глубже изучить использование mysql. Я даже не знал, что case — это вещь, спасибо =)