mysql - php. Как найти

0

У меня есть 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

Теги:

3 ответа

1

Прежде всего вам не разрешено использовать агрегированные функции (т.е. 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!

0
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
0

Спасибо за ответ, но я поймал проблему теперь у меня есть новый файл 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 $, а не повторяющуюся строку: (

  • 0
    Вы должны задать это как отдельный вопрос. И если существующие ответы хороши, вы должны принять один из них.

Ещё вопросы

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