У меня есть 2 таблицы
users : id , name
order : id , price, user_id
пользователи имеют более одного порядка. И я хочу выбрать пользователей
кто имеет общую цену > 100. как это сделать?
EX: пользователь John имеет 3 заказа с ценой: 30 $, 40 $, 50 $
SELECT * FROM user u
INNER JOIN order o ON o.user_id = u.id
WHERE sum(o.price) >100
этот запрос получит пользователя john? 30 + 40 + 50 = 110 > 100
Прежде всего вам не разрешено использовать агрегированные функции (т.е. SUM
) в вашем предложении WHERE
. Они должны использоваться в предложении HAVING
. Для вычисления агрегатов вам нужно GROUP BY
что-то, в вашем случае u.id
.
Итак:
SELECT *
FROM user u
INNER JOIN order o ON u.user_id = u.id
GROUP BY u.id
HAVING sum(o.price) > 100
Обратите внимание: если вам понадобятся пользователи без заказа, вам нужно будет использовать LEFT JOIN
!
SELECT u.Id, Sum(o.price) FROM user u
INNER JOIN order o ON o.user_id = u.id
GROUP BY u.Id
HAVING sum(o.price) > 100
Спасибо за ответ, но я поймал проблему теперь у меня есть новый файл order_file таблицы
users : id , name
order : id , price, user_id
order_file : id , file , order_id
пользователи, порядок один-много
order, order_file - один-много
пользователь John имеет 1 заказ с ценой 200 $ и эта ссылка заказа на файл order_ с двумя записями
SELECT *
FROM user u
INNER JOIN order o ON u.user_id = u.id
INNER JOIN order_file of ON of.order_id = o.id
WHERE u.name = 'John'
мы получим две строки. Только значение diff в файле order_file
теперь, чтобы получить один раз, когда я использую DISTINCT, и я получаю 1 строку
SELECT DISTINCT *
FROM user u
INNER JOIN order o ON u.user_id = u.id
INNER JOIN order_file of ON of.order_id = o.id
WHERE u.name = 'John'
тогда я делаю SUM, oh la la, я получаю 400 $, а не 200 $
SELECT DISTINCT *, sum(o.price)
FROM user u
INNER JOIN order o ON u.user_id = u.id
INNER JOIN order_file of ON of.order_id = o.id
WHERE u.name = 'John'
как я могу получить извлечение 200 $, а не повторяющуюся строку: (