Я искал несколько часов, но не смог найти относительного решения для конкретного алгоритма, над которым я работаю. Чтобы упростить препятствие, я хотел бы представить информацию только в одной таблице.
_____________________________________
| 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 и сравнивать каждый индекс?
Вы не можете использовать агрегатную функцию в WHERE
оговорка, вы должны использовать HAVING
, WHERE
работает с отдельными строками во время выбора, HAVING
действует на конечные результаты после агрегирования.
SELECT *, SUM(price*qty) as Total
FROM table
GROUP BY user
HAVING Total >= 300 AND SUM(qty) <= 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