Обновить первичный ключ, отсортированный по другому столбцу, обработка дубликатов?

Попытка в основном пересчитать основной столбец, что означает обновление с первого до последнего, увеличивая значение с каждой строкой. Сначала я выбираю,

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» для ключа «ПЕРВИЧНЫЙ»

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector