Попытка в основном пересчитать основной столбец, что означает обновление с первого до последнего, увеличивая значение с каждой строкой. Сначала я выбираю,
select
`someid`,
`time`
from
`table`
ORDER BY
`time` ASC
получить результат,
$data = new SplFixedArray($query->num_rows);
$data = $query->fetch_all();
и обновление таблицы.
for($i=1; $i<count($data); $i++){
print_r("UPDATING | New someid: " . $i . " WHERE old someid: " . $data[$i][0] . " AND time = " . $data[$i][1] . "<br />");
$query = $mysqli->query("UPDATE `table` SET `someid` = '" . $i . "' WHERE `time` = '" . $data[$i][1] . "' AND `someid` = '".$data[$i][0]."'");
}
Меня смущает то, что первые несколько записей не отсортированы правильно. Это как
someid | time
--------------
0 | 0
2 | 1
1 | 2
7 | 3
11 | 4
6 | 5
Это из-за дубликатов. После 15-ти строк в «someid» есть разрыв, и он прыгает до 60. Так что после этого больше нет дубликатов someids. Но как я могу обработать первые несколько строк? Если я хочу обновить someid до 2, но 2 уже существует?
Есть ли способ справиться с этим, не используя слишком много запросов?
Редактировать:
Может быть, это неясно для некоторых. В основном я пытаюсь обновить значения int из основного столбца. В общем, я считаю их и ввожу их соответствующее число в someid, отсортированное по времени. Когда-нибудь это дата-время. Таким образом, самое раннее «sometime» получит «someid» = 1.
На данный момент у кого-то есть пробелы. 1..2..3..4..5..6..7..15..16..17..18..30..31..32
Обновление, как я делаю сейчас, не работает, пока я не достигну пробела. Потому что я пытаюсь написать дублирующее значение. Обновление первого someid до 1, который может иметь значение 11, не работает, потому что someid 1 уже где-то существует.
Я бы обновил где-то 15 до 8, потому что это следующий номер. Это работает, потому что 8 — 14 отсутствуют, и я не дублирую значение.
Одним из решений может быть создание другого цикла и сначала обновлять каждый someid до некоторого составленного числа, возможно, начинать считать с row-> count, увеличивая для каждой строки. После этого я могу обновить их как обычно. Но разве нет лучшего решения?
// ОБНОВИТЬ:
Это:
SET @count = 0;
UPDATE `table` SET `table`.`someid` = @count:= @count+ 1;
«Сбрасывает» идентификаторы, но не сортирует их по времени.
Пробую это:
SET @count = 0;
UPDATE `table` SET `table`.`someid` = @count:= @count+ 1;
ORDER BY `time` DESC;
Дает мне следующую ошибку:
Дублирующая запись «1» для ключа «ПЕРВИЧНЫЙ»
Задача ещё не решена.
Других решений пока нет …