У меня есть запрос, который возвращает именно то, что я хочу, когда есть только один тип группы по ответу. При наличии нескольких я получаю сообщение об ошибке "Подзапрос возвращает более 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
Вы можете сделать это в одном запросе, используя выражение 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")
.
count()
должен бытьsum()
.COUNT(IF(u.member_type='cook',1,NULL))
. Как отмечает @Barmar, мы можем сделатьSUM(u.member_type='cook') AS cooks
в качестве ярлыка.