Я создаю простую веб-страницу PHP с базой данных MySQL. База данных MYSQL имеет следующее содержимое: (иллюстрация слева) Я просто хочу знать возможный способ выполнения некоторых манипуляций с данными для достижения результатов в правой части ниже.

 (initial value)                                                 (final result)

    ID | MINUS '1'(to "next" ID's)                ID |               ID |

     1 |   0                                       1 | ------------>  1 | 
     2 |   1 --> (will minus '1' to ID 3           2 | ------------>  2 | 
     3 |   0     up to the last)            3-1 =  2 | ------------>  2 | 
     4 |   0                                4-1 =  3 | ------------>  3 | 
     5 |   1 --> (minus '1' AGAIN to ID 6   5-1 =  4 | ------------>  4 | 
     6 |   0      up to the last)           6-1 =  5      -1    --->  4 | 
     7 |   0                                7-1 =  6      -1    --->  5 | 

Он просто подсчитывает количество минусов, а затем вычитает его из ВСЕХ идентификаторов, следующих за ним. Идентификатор 2 сообщает следующему идентификатору, который равен 3, чтобы вычесть 1 до последнего идентификатора (3-1, 4-1, 5-1, 6-1, 7-1), но пришел другой экземпляр. ID 5 указывает ID 6 вычесть себя снова до последнего, поэтому МИНУС 2 от ID 6 до последнего ID. всего 6-1, 7-1 ---> 6-2, 7-2.

Я знаю, что для вас это звучит очень легко, но я новичок и считаю это трудным. Простите за головную боль. Надеюсь, кто-то поможет, спасибо!

Мой DML похож (просто для иллюстрации, он должен быть на php, я его конвертирую, просто помогите мне в ЛОГИКЕ)

for($x=0;$x<num_rows;$x++)
   {

   if(MINUS = 1){
      query(UPDATE table_name SET ID=ID-1 WHERE ID = $x);}
    }

Что-то вроде этого, я все еще новичок в циклах принятия решений. Буду признателен, если почините мою петлю. Я новичок в этом сообществе, прошу вашего понимания.

1
user3425991 16 Мар 2014 в 20:34
2
Можете ли вы поделиться кодом, который вы пробовали до сих пор? Нам было бы легче помочь вам, если бы мы знали, что вы пробовали.
 – 
aashnisshah
16 Мар 2014 в 20:37
Я только что обновил его, пожалуйста, посмотрите
 – 
user3425991
16 Мар 2014 в 20:53

2 ответа

Лучший ответ

Вы можете сделать это в MySQL, используя переменные или стандартный SQL. Вот стандартный SQL:

select id, minus,
       (id - coalesce((select sum(minus) from table t2 where t2.id < t.id), 0)) as newId
from table t;

Вот версия переменной:

select id, minus,
       (id - minus + (@value := @value + minus)) as newId
from table t cross join
     (select @value = 0) const
order by id
1
Gordon Linoff 16 Мар 2014 в 21:07
Здравствуйте, спасибо за ответ. Могу я спросить, какое «значение» вы имеете в виду в select id, value. Я знаю, что это очень нубский вопрос, извините
 – 
user3425991
16 Мар 2014 в 20:55
«id» и «value» - это то, что будет возвращено, когда запрос sql завершится. Я думаю, что Гордон хотел использовать здесь минус, поэтому измените его на «минус» и попробуйте.
 – 
aashnisshah
16 Мар 2014 в 21:02
Извините за беспокойство, но я действительно не могу полностью получить ваш ответ. Не поймите меня неправильно, это плохо, я новичок. Не могли бы вы просто объяснить немного подробнее. Что вы имеете в виду под «значением», «t2.id» и «t.id»? Пожалуйста, помогите
 – 
user3425991
16 Мар 2014 в 21:02
Хорошо, я попробую. Спасибо за разработку.
 – 
user3425991
16 Мар 2014 в 21:03
Я застрял, где или как я должен получить это значение? я должен инициализировать его, получить его из чего-то, например, из строки?
 – 
user3425991
16 Мар 2014 в 21:06

Вы можете использовать реализацию MySQL следующим образом:

select id, minus,
   (id - coalesce((select sum(minus) from table t2 where t2.id < t.id), 0)) as newId

Из таблицы t;

Идея кода пришла из сообщения Гордона, вот уточнение.

Первая часть - это select, в которой говорится, что вы хотите выбрать определенный ввод из mysql. id, minus следует за ним и означает, что вы хотите вернуть значения id и minus по завершении выполнения запроса.

Остальная часть попадает в третью часть, где вы выполняете вычитание и возвращаете значение вычитания как newId. Поэтому, когда sql вернется, он получит строку с ID, MINUS и NEWID в качестве заголовков.

Вычитание работает следующим образом: coalesce возвращает первое ненулевое значение (т.е. 1) в списке. table t2 использует вторую версию таблицы и называет ее t2, чтобы вы могли сравнить информацию.

Надеюсь, это прояснило вам ситуацию!

0
aashnisshah 16 Мар 2014 в 21:16
2. Могу ли я напрямую протестировать стандартный SQL? потому что я использую MySQL Query Browser
 – 
user3425991
16 Мар 2014 в 21:27
Я вызываю у вас головную боль, но, пожалуйста, не сердитесь, в чем разница между t2 и t? как я должен поставить его браузер запросов.
 – 
user3425991
16 Мар 2014 в 21:28
Я имею в виду, как мне запросить t2, как я могу заставить t2 ссылаться на вторую версию таблицы?
 – 
user3425991
16 Мар 2014 в 21:31
Пожалуйста, ответьте на него. не торопитесь всегда
 – 
user3425991
16 Мар 2014 в 21:33
Спасибо за ответ еще раз. я имею в виду, как мне запросить t2, как я могу заставить t2 ссылаться на вторую версию таблицы? Спасибо вам за вашу помощь. Надеюсь, вы ответите снова. Я вернусь завтра и сообщу вам как можно скорее. Спасибо за время, Спокойной ночи.
 – 
user3425991
16 Мар 2014 в 21:37