MySQL: «Подзапрос возвращает более 1 строки» при выборе результатов нескольких подзапросов - PullRequest
0 голосов
/ 19 декабря 2018

Я получаю ошибку "Subquery returns more than 1 row" при выполнении запроса, который должен возвращать результаты двух подзапросов.Почему возвращение более чем одной строки здесь является проблемой, и как я могу обойти эту проблему?

Таблицы данных и соответствующие поля выглядят так:

Accounts
id

Meetings
account_id
assign_user_id
start_date

Users
id
last_name

Встреча назначается учетной записи и пользователю.Я пытаюсь создать таблицу, в которой будет отображаться количество собраний для каждого назначенного пользователя для учетной записи, где дата начала собрания находится в разных диапазонах дат.Диапазоны дат должны быть расположены в той же строке, что и таблица с такими заголовками:

Account |Фамилия пользователя |Встречи 1-31 дней в будущем |Встречи 31-60 дней в будущем

, как показано на этом изображении:

this image.

Это мой запрос:

SELECT
(SELECT
    a.name
  FROM
    accounts AS a
  JOIN
    meetings AS m ON a.id = m.account_id
    AND date_start BETWEEN CURDATE() AND DATE_ADD(CURDATE(),INTERVAL 60 DAY)
  JOIN
    users AS u ON m.assigned_user_id = u.id
  WHERE
    m.status = 'Planned'
    AND m.deleted = 0
GROUP BY a.id, u.id) AS 'Account',
(SELECT
    u.last_name
  FROM
    accounts AS a
  JOIN
    meetings AS m ON a.id = m.account_id
    AND date_start BETWEEN CURDATE() AND DATE_ADD(CURDATE(),INTERVAL 60 DAY)
  JOIN
    users AS u ON m.assigned_user_id = u.id
WHERE
    m.status = 'Planned'
    AND m.deleted = 0
GROUP BY a.id, u.id) AS 'Name',
(SELECT
    COUNT(m.id)
  FROM
    accounts AS a
  JOIN
    meetings AS m ON a.id = m.account_id
    AND date_start BETWEEN CURDATE() AND DATE_ADD(CURDATE(),INTERVAL 30 DAY)
  JOIN
    users AS u ON m.assigned_user_id = u.id
  WHERE
    m.status = 'Planned'
    AND m.deleted = 0
GROUP BY a.id, u.id) AS 'Meetings 1-30 days',
(SELECT
    COUNT(m.id)
  FROM
    accounts AS a2
  JOIN
    meetings AS m ON a.id = m.account_id
    AND m.date_start BETWEEN DATE_ADD(CURDATE(),INTERVAL 31 DAY) AND DATE_ADD(CURDATE(),INTERVAL 60 DAY)
  JOIN
    users AS u ON m.assigned_user_id = u.id
  WHERE
    m.status = 'Planned'
    AND m.deleted = 0
GROUP BY a.id, u.id) AS 'Meetings 31-60 days'

Столбцы, содержащие имена учетных записей и имена пользователей, должны были быть добавлены как подзапросы, чтобы избежать ошибок "Operand should contain 1 column(s)".Столбцы, соответствующие количеству собраний, должны быть подзапросами, поскольку ни одна строка объединенной таблицы не может одновременно соответствовать обоим диапазонам дат.Каждый подзапрос возвращает ожидаемые результаты при запуске индивидуально.Но я получаю «Subquery returns more than 1 row», когда подзапросы собраны, как показано.Я пытался назначить разные псевдонимы для каждого подзапроса, но это не помогло.

1 Ответ

0 голосов
/ 19 декабря 2018

SQL-запросы не возвращают вложенные результирующие наборы;поэтому выражение (например, подзапрос), используемое в предложении SELECT, не может иметь несколько значений, так как это «вложит» его значения.Скорее всего, вам просто нужно использовать условное агрегирование, например, так:

SELECT a.id, u.id, a.name, u.last_name
    , COUNT(CASE WHEN m.date_start BETWEEN CURDATE() AND DATE_ADD(CURDATE(),INTERVAL 30 DAY) THEN 1 ELSE NULL END) AS `Meetings 1-30 days`
    , COUNT(CASE WHEN m.date_start BETWEEN DATE_ADD(CURDATE(),INTERVAL 31 DAY) AND DATE_ADD(CURDATE(),INTERVAL 60 DAY) THEN 1 ELSE NULL END) AS `Meetings 31-60 days`
    , COUNT(CASE WHEN  THEN 1 ELSE NULL END) AS 
FROM accounts AS a
JOIN meetings AS m ON a.id = m.account_id
JOIN users AS u ON m.assigned_user_id = u.id
WHERE m.status = 'Planned' AND m.deleted = 0
  AND m.date_start BETWEEN CURDATE() AND DATE_ADD(CURDATE(),INTERVAL 60 DAY)
GROUP BY a.id, u.id, a.name, u.last_name
;

Примечания: ELSE NULL технически автоматический и может быть опущен;это просто для ясности.Агрегатные функции, такие как COUNT, игнорируют значения NULL;только нулевые значения влияют на такие функции, когда они встречаются только с нулевыми значениями (в этом случае их результаты равны нулю).

Sidenote: Вы могли бы продолжить свой запрос в форме, аналогичнойк тому, что у вас изначально было;если бы вы включили поля группировки в результаты подзапросов, подзапросы могли бы быть объединены (но это было бы избыточным объединением учетных записей, собраний и пользователей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...