Probeer dit:
SET @idrank = 0;
SET @numrank = 0;
UPDATE
tbl a
INNER JOIN
(
SELECT id, @idrank:[email protected]+1 AS id_rank
FROM tbl
ORDER BY id
) b ON a.id = b.id
INNER JOIN
(
SELECT number, @numrank:[email protected]+1 AS number_rank
FROM tbl
ORDER BY number
) c ON b.id_rank = c.number_rank
SET
a.number = c.number;
Dit zorgt voor hiaten en onregelmatigheden in het veld nummer
en duplicaten. Stel dat de volledige gegevensset zoiets was als:
id | number
---------------
2 | 534
3 | 421
6 | 2038
7 | 41
10 | 5383
11 | 5
12 | 933
15 | 43
De resulterende tabel die na de update wordt ingesteld, is:
id | number
---------------
2 | 5
3 | 41
6 | 43
7 | 421
10 | 534
11 | 933
12 | 2038
15 | 5383
Verklaring:
Het neemt in principe de oplopende rijen van elk veld afzonderlijk en voegt zich bij elkaar in de rangorde, zodat de geordende id
overeenkomt met het bijbehorende geordende nummer
.
De eerste INNER JOIN
subselect ziet er als volgt uit:
id | id_rank
---------------
2 | 1
3 | 2
6 | 3
7 | 4
10 | 5
11 | 6
12 | 7
15 | 8
Dan zal de tweede INNER JOIN
subselect dit leuk vinden:
number | number_rank
---------------
534 | 5
421 | 4
2038 | 7
41 | 2
5383 | 8
5 | 1
933 | 6
43 | 3
Wanneer u vervolgens de twee subselecteert op id_rank
= number_rank
, geeft u de stijgende volgorde van de twee velden op. Als u dat eenmaal hebt, wordt bijwerken een kwestie van het instellen van het tabelnummer = het nummer van de tweede gekoppelde tafel.