@sp999999

Как выполнить подзапрос в SQL (SELECT с передачей параметра из основного запроса?

Подскажите, как решить такую задачу.

Условно, есть таблица Users
id, name

Есть таблица Orders
id, number, user_id

Я хочу через подзапрос посчитать кол-во заказов по каждому пользователю.

Что-то вроде
select users.name as username,
(select count(id) from orders where user_id=users.id) as orders_count
from users

Насколько я понимаю, т.к. подзапросы выполняются снизу вверх, то users.id не получиться передать в подзапрос.

Да, можно сделать join, но с ним проблема у меня, т.к. в моем случае он уже там есть по другим критериям с этими же таблицами, по которым я хочу посчитать данные, в общем нужен какой другой механизм. Т.е.
  • Вопрос задан
  • 1442 просмотра
Пригласить эксперта
Ответы на вопрос 2
@MikUrrey
select u.name as username,
(select count(id) from orders where user_id=u.id) as orders_count
from users u

Добавляем псевдоним для таблицы users. Так должно сработать.
Но вариант не очень, предполагаю, что зная все условия, можно придумать более производительное решение.
Ответ написан
@Akina
Сетевой и системный админ, SQL-программист.
SELECT users.name AS username,
       count(orders.id) AS orders_count 
FROM users
JOIN orders ON orders.user_id=users.id
GROUP BY users.name

Если нужно вывести и пользователей, у которых нет заказов, с нулевым количеством, то использовать LEFT JOIN.

PS. Запрос из текста вопроса тоже корректен и должен дать правильный результат. Причём с 50% вероятностью он будет преобразован в мой (точнее, оба дадут один и тот же план выполнения). Остальные 50% - на то, что он будет выполнен итерационно (и тогда скорее всего просто будет выполняться дольше).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы