MySQL — выбор суммы суммы на основе конкретного условия

Я искал несколько часов, но не смог найти относительного решения для конкретного алгоритма, над которым я работаю. Чтобы упростить препятствие, я хотел бы представить информацию только в одной таблице.

_____________________________________
|  User  |  Item  |  price  |  qty  |
-------------------------------------
|  Annie | Dress  |   80    |  1    |
|  Bob   | Jeans  |   65    |  3    |
| Cathy  | Shoes  |   60    |  4    |
| David  | Shirts |   40    |  6    |
| Annie  | Shoes  |   60    |  2    |
|  Bob   | Shirts |   55    |  2    |
| Cathy  | Jeans  |   65    |  1    |
| David  | Ties   |   20    |  5    |
-------------------------------------

Задача № 1: показать пользователям, чья общая цена покупки в магазине составляет 300 и более, а количество их покупок меньше или равно 3. Эти покупатели получат купон на 40 долларов по почте.

Проблема № 2: Показать пользователей, чье общее количество больше или равно 7, а общая цена 275 или больше. Этим покупателям будет отправлен купон на 20 долларов.

Строки в таблице не зависят от транзакции. Таблица может представлять отдельные транзакции в течение месяца. Мы просто пытаемся найти постоянных клиентов, которых мы хотели бы наградить за покупки у нас.

Я не уверен, что это можно сделать только через MySQL, или мне нужно иметь отдельные запросы и хранить строки в массивах и сравнивать их один за другим.

До сих пор я пробовал следующие:

SELECT * FROM table where SUM(price) as Total >= 300 AND SUM(qty) <=3;

Я также попробовал следующее после исследования:

SELECT SUM(price) as Total FROM table WHERE SUM(qty) <=3;

Я продолжаю получать синтаксические ошибки в оболочке MySQL. Вам не нужно решать проблемы за меня, но если вы сможете провести меня через логику о том, как решать проблемы, я буду очень признателен.

Наконец, я хотел бы спросить один раз, могу ли я решить эту проблему только с MySQL или мне нужно хранить строки в массивах PHP и сравнивать каждый индекс?

0

Решение

Вы не можете использовать агрегатную функцию в WHERE оговорка, вы должны использовать HAVING, WHERE работает с отдельными строками во время выбора, HAVING действует на конечные результаты после агрегирования.

SELECT *, SUM(price*qty) as Total
FROM table
GROUP BY user
HAVING Total >= 300 AND SUM(qty) <= 3
3

Другие решения

SUM является агрегатной функцией, то есть применяется к группе рядов с трещинами. Скажем, я группирую данные таблицы на основе NAME, тогда функция sum суммирует все price одного ИМЕНИ.
Сказав это, если вы думаете логически, не имеет никакого смысла ставить sum(price) в предложении WHERE, потому что предложение where не будет знать, какая сумма (цена) для какой NAME работать (где предложение действует только после создания временного представления).
Итак, у нас есть HAVING предложение в SQL. Это используется для сравнения результатов агрегированной функции на каждом этапе агрегации.

Рассмотрим это так:
В предложении where, когда возвращается строка ANNIE из вашей БД, она не знает, что означает SUM (PRICE).
Находясь в предложении HAVING, условие SUM (PRICE)> 300 выполняется только тогда, когда SQL завершил группирование всех данных ANNIE в одну группу и вычислил для нее SUM (PRICE).

На вопрос 1:

SELECT USER, SUM(PRICE)
FROM table
GROUP BY user
HAVING SUM(PRICE) >= 300 AND SUM(QTY) <= 3

Для вопроса 2:

SELECT USER, SUM(PRICE)
FROM table
GROUP BY user
HAVING SUM(PRICE) >= 275AND SUM(QTY) >=7
0

По вопросам рекламы [email protected]