#mysql
#mysql
Вопрос:
Имея следующую таблицу
------------------------
| id | product_id | units|
------------------------
| 1 | 6949 | 3 |
| 2 | 6949 | 7 |
| 3 | 6912 | 0 |
| . | . | . |
------------------------
Я хочу подсчитать, сколько единиц связано с идентификатором продукта, поэтому я использую следующий запрос:
ВЫБЕРИТЕ id, product_id, SUM (единицы измерения) В качестве единиц измерения Из таблицы, СГРУППИРОВАННОЙ По product_id;
Которое вернет
------------------------
| id | product_id | units|
------------------------
| 1 | 6949 | 10 |
| 2 | 6912 | 0 |
------------------------
Как я мог бы использовать «update» для вычитания 1 единицы из любого продукта, используя его product_id? Спасибо
Комментарии:
1. Этот запрос вернет синтаксическую ошибку.
2.
UPDATE
используется для фактического изменения значения в вашей таблице. Если вы хотите это сделать, вам нужно указать, в какой строке вы хотите изменить единицы измерения. Оно не может быть обновлено наSUM
3. @isaace это именно то, чего я пытаюсь достичь. Я не возражаю, на какую строку влияет, если sum () является согласованным
Ответ №1:
Ваш вопрос просто запрашивает базовый GROUP BY
запрос, и здесь действительный:
SELECT
product_id,
SUM(units) AS units
FROM yourTable
GROUP BY
product_id;
Но в вашем вопросе есть изюминка, потому что id
отображаемое в наборе результатов sample на самом деле является номером строки, упорядоченным по одному из id
значений в каждой группе продуктов. Мы можем попробовать написать этот запрос:
SELECT
ROW_NUMBER() OVER (ORDER BY MIN(id)) id,
product_id,
SUM(units) AS units
FROM yourTable
GROUP BY
product_id;
ДЕМОНСТРАЦИЯ
Комментарии:
1. спасибо за ваш ответ, но это не то, о чем я спрашивал
Ответ №2:
Попробуйте
UPDATE table SET units = units - 1 WHERE product_id = ?
Комментарии:
1. это повлияло бы на все строки с этим product_id, и это именно то, чего я пытаюсь избежать. Я хотел бы вычесть 1 только из одной из этих строк
Ответ №3:
Выходные данные вашего запроса не отражают содержимое вашей таблицы, поле id для продукта 6912
не может быть 2
, если это не число строк, как предлагает @Tim. Я предполагаю, что это опечатка, поэтому to явно использует идентификатор в таблице результатов, позволяет явно выбрать тот, который мы хотим;
select min(id) min_id, product_id, sum(units) agg_units, sum(units) - 1 agg_units_minus_one from product group by product_id order by min_id;
------ ------------ ----------- ---------------------
| id | product_id | agg_units | agg_units_minus_one |
------ ------------ ----------- ---------------------
| 1 | 6949 | 10 | 9 |
| 3 | 6912 | 0 | -1 |
------ ------------ ----------- ---------------------
Теперь, если вы действительно хотите обновить единицы измерения, у нас, по крайней мере, есть уникальный идентификатор / комбинация продуктов для использования и значение для присвоения, но я подозреваю, что это не то, что вы хотите (будущие агрегации будут неправильными).
Комментарии:
1. Неплохой подход, но не то, что я искал, спасибо
Ответ №4:
Возможно, я забыл указать, что меня волнует результат sum (), а не то, правильно ли указано поле units каждой строки. Я боялся, что простое обновление повлияет на все строки с этим product_id, поэтому запрос будет
ОБНОВИТЬ таблицу SET units = единицы измерения — 1, ГДЕ product_id = 6949 ПРЕДЕЛ 1;