W MySQL kolejne numery przeważnie nadawane są w kolumnach, gdzie wartości są ustalane przez opcję AUTO_INCREMENT. Są to pierwsze kolumny identyfikujące ID danego rekordu.
Czasami jednak są dodatkowe kolumny, które np. ustalają pozycję danego rekordu. Jak wgrywamy dane do tabeli – musimy ręcznie nadawać kolejne numery wierszom.
Istnieje jednak proste zapytanie SQL które jest w stanie wypełnić taką kolumnę kolejnymi liczbami:)
Oto one:
1 2 |
SET @pos := 0; UPDATE `nasza_tabela` SET `position` = ( SELECT @pos := @pos + 1 ); |
Tutaj kolumną którą wypełniamy jest kolumna o nazwie position.
Możemy też ograniczyć numerowanie dla określonych tylko wierszy.
Przykład. Mamy tabelę „jakas_tabela„:
1 2 3 4 5 6 7 8 9 10 11 12 |
mysql> select * from jakas_tabela; +----+-----------+---------+---------+ | id | kolor | wartosc | pozycja | +----+-----------+---------+---------+ | 1 | czerwony | AAA | NULL | | 2 | niebieski | ZZZ | NULL | | 3 | czerwony | ABC | NULL | | 4 | niebieski | XYZ | NULL | | 5 | niebieski | RRR | NULL | | 6 | niebieski | YYY | NULL | +----+-----------+---------+---------+ 6 rows in set (0.00 sec) |
I chcemy tutaj ponumerować wartości w kolumnie pozycja od 1 do 4 dla niebieskiego i od 1 do 2 dla czerwonego. Jak to zrobić?
Wystarczy wywołać poniższe zapytanie:
1 2 3 4 5 |
SET @pos := 0; UPDATE `jakas_tabela` SET `pozycja` = ( SELECT @pos := @pos + 1 ) WHERE `kolor` = 'czerwony'; SET @pos := 0; UPDATE `jakas_tabela` SET `pozycja` = ( SELECT @pos := @pos + 1 ) WHERE `kolor` = 'niebieski'; |
Gotowe. Po odp. posortowaniu zapytania widać, że zapytanie działa:
1 2 3 4 5 6 7 8 9 10 11 12 |
mysql> select * from jakas_tabela ORDER by kolor,pozycja; +----+-----------+---------+---------+ | id | kolor | wartosc | pozycja | +----+-----------+---------+---------+ | 1 | czerwony | AAA | 1 | | 3 | czerwony | ABC | 2 | | 2 | niebieski | ZZZ | 1 | | 4 | niebieski | XYZ | 2 | | 5 | niebieski | RRR | 3 | | 6 | niebieski | YYY | 4 | +----+-----------+---------+---------+ 6 rows in set (0.00 sec) |
Może dla 6 wierszy ręczna zmiana nie stanowi problemu, ale dla kilkudziesiędziu tysięcy – już tak 🙂
grafika:alphacoders.com