пытаюсь использовать подзапрос, но подзапрос возвращает более одной строки с квалификаторами

#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 — это вещь, спасибо =)