2012-05-11 2 views
1

Вот моя таблица:
table. id (автоинкремент, первичный ключ)
table. qty (возможные значения: 0 - 1000)Удаление количества из нескольких строк в базе данных

Ряды:

 
+----+-----+ 
| id | qty | 
+----+-----+ 
| 1 | 0 | 
| 2 | 5 | 
| 3 | 5 | 
| 4 | 10 | 
+----+-----+ 

Я хочу, чтобы уменьшить количество доступных на 12. Значение, новый результат должен быть:
Edit: я, наверное, должен был указан все эти числа произвольны. Они могут быть чем угодно.

 
+----+-----+ 
| id | qty | 
+----+-----+ 
| 1 | 0 | 
| 2 | 0 | 
| 3 | 0 | 
| 4 | 8 | 
+----+-----+ 

Прямо сейчас, я делаю следующее:

  1. SELECT id, qty FROM table WHERE qty > 0 LIMIT 12

  2. фильтр через все данные, чтобы выяснить, что кол-во, чтобы удалить из каждой строки

  3. использования подготовленный отчет PDO для массового обновления затронутых строк:

    UPDATE `table` SET qty = ? WHERE id = ?` 
    

Мой вопрос: есть ли способ сделать это в MySQL?

+0

Как вы определяете распределение 12 по четырем различным значениям id? Приведите их в порядок? Вычесть из всех одинаково? Два ответа, предоставленные до сих пор, на самом деле не дают вам поведения, которое вы хотите. –

+0

Вниз идентификаторы в порядке. – phpmeh

ответ

5
SET @q = 12; 

UPDATE `table` 
SET qty = CONCAT(GREATEST(qty - @q, 0), LEFT(@q := @q - LEAST(qty, @q), 0)) 
ORDER BY id; 

Посмотрите на sqlfiddle.

+0

Из того, что я читал об этом сейчас, я понимаю, что это будет проходить через каждую строку, поскольку каждая строка будет делать истинное ложное утверждение: если qty-12 больше 0, он будет возвращать любую эту разницу; в противном случае он вернется 0. Мне понадобится это, чтобы просто пойти на один шаг дальше и превратить 12 в число, уменьшающееся. Я думаю, вы используете: количество, но я потерялся оттуда. – phpmeh

+0

Привет, я не могу заставить это работать. Запятая вызывает ошибку - # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '@q: = @q - LEAST ('inv_layer'.'qty_avail', @q) ORDER BY' inv_layer'.'id'' at line 1 – phpmeh

+0

@phpmeh: Хм ... извините за это ... Я не ожидал, что 'UPDATE' будет * требовать * каждое присваивание быть в столбце ... обновленный код выше был протестирован и работает! – eggyal

Смежные вопросы