Исправлена ошибка «Подзапрос возвращает более 1 строки»

0

У меня есть запрос, который возвращает именно то, что я хочу, когда есть только один тип группы по ответу. При наличии нескольких я получаю сообщение об ошибке "Подзапрос возвращает более 1 строки".

Я пробовал несколько способов структурирования запроса, включая использование "in", но не смог заставить что-либо работать.

SELECT 
    (
    SELECT substring(postcode, 1, locate (' ', postcode) - 1)
    FROM user_locations AS ul
    JOIN users AS u ON u.id = ul.user_id
    WHERE u.membertype = "customer"
    ) AS postcode,
    (
    SELECT count(u.membertype)
    FROM users AS u
    JOIN user_locations AS ul ON u.id = ul.user_id
    WHERE u.membertype = "cook"
    GROUP BY ul.postcode

    ) AS cook,
    (
    SELECT count(u.membertype)
    FROM users AS u
    JOIN user_locations AS ul ON u.id = ul.user_id
    WHERE u.membertype = "customer"
    GROUP BY ul.postcode
    ) AS customer

где у меня есть несколько почтовых индексов, я бы ожидал увидеть

Postcode | Cooks | Customers
G83      | 12    | 34 
G84      | 19    | 76
G85      | 10    | 50
Теги:

1 ответ

0

Вы можете сделать это в одном запросе, используя выражение u.membertype=xxx которое равно 1, если истинно, иначе 0.

SELECT ul.postcode AS "Postcode",
       SUM(u.membertype="cook") as "Cooks"
       SUM(u.membertype="customer") as "Customers"
FROM users AS u
JOIN user_locations AS ul ON u.id = ul.user_id
GROUP BY ul.postcode

Если там, где более двух типов элементов, можно добавить WHERE u.membertype IN ("cook","customer").

  • 1
    count() должен быть sum() .
  • 0
    если мы хотим использовать COUNT () в условной агрегации, вычисляемое нами выражение должно будет возвращать NULL для строк, которые мы не хотим включать в счетчик, например, COUNT(IF(u.member_type='cook',1,NULL)) . Как отмечает @Barmar, мы можем сделать SUM(u.member_type='cook') AS cooks в качестве ярлыка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню