Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie tabeli MySQL raz jeszcze
Forum PHP.pl > Forum > Bazy danych > MySQL
Black-Berry
Chciałbym posortować tabelę mySQL według pola "kolejnosc". Pole to zawiera liczby zmiennoprzecinkowe. Chodzi mi teraz o to żeby posortować wszystkie wpisy w tabeli wedłóg wartości w tym polu ale tak aby nowo powstała tabela zawierała liczby od 1 w górę w polu "kolejnosc". np:

Kod
ID   |  Name   |  kolej
------------------------
1.   |  abcde  |  1.12
2.   |  dedgh  |  3.23
3.   |  asdfs  |  0.45


miałoby przetworzoną postac

Kod
ID  |  Name   |  kolej
------------------------
3.  |  asdfs  |    1
1.  |  abcde  |    2
2.  |  dedgh  |    3


I ważne jest żeby ta nowa tabela zapisała sie na serwerze mySQL. Nie chodzimi tylko o wyswietlenie. Wie ktoś może z której strony to ugryźć ?
kszychu
A pole id się nie przestawia?
Jeśli to ma być ponownie zapisane, to najlepiej zaciągnąć te wartości z bazy, obrobić je (posortować) np. w php i ponownie zapisać do bazy.
Black-Berry
Pole ID to klucz główny (zapomniełem przestawić - już poprawiam). Sposób który proponujesz jest dobry ale wymaga PHP a dobrze byłoby to zrobić zapytaniem do bazy bo zależy mi na optymalizacji.
Darti
  1. CREATE TABLE `baza`.`nowa_tabela` (
  2. `ID` int( 11 ) NOT NULL ,
  3. `name` varchar( 30 ) NOT NULL ,
  4. `kolej` float NOT NULL
  5. ) ENGINE = MYISAM;
  6.  
  7. INSERT INTO `baza`.`nowa_tabela` (SELECT *
  8. FROM `baza`.`stara_tabela` WHERE `kolej` >= 1 ORDER BY `kolej`)
Black-Berry
no dobry pomysł ale może dałoby się działać tylko na 1 tabeli ? Może ktoś wie jak zrobić procedurę jakąś.


P.S. Co znaczy ENGINE = MYISAM;?
nospor
Cytat
P.S. Co znaczy ENGINE = MYISAM;?

To znaczy, ze masz zajrzec do manuala:
http://dev.mysql.com/doc/refman/5.0/en/storage-engines.html

ps: a na grzyba ci trzymac w tabeli dane posortowane? Po to stworzono bazy danych by kombinowac jak najmniej. chcesz miec cos posortowane to uzywasz select .... order by..... a nie kombinujesz smile.gif Po to sa indexy by takie operacje byly szybkie.
Black-Berry
Bo dane wprowadzam 30 razy rzadziej niz odczytuje (chodzi o miejsca w kodzie gzie mam odpowiednie procedury). Jesli od razu po wprowadzeniu sobie posortuję to później mam łatwiej. Nie muszę przy odczycie wprowadzać dodatkowych zmiennych. A poza tym struktura systemu jest bardziej przejżysta. To naturalne jeśli wszystko mam posortowane przed odczytem.
Darti
Można to zrobić na jednej tabeli. Radzę zastosować w takim przypadku wykorzystać transakcje, wtedy to mniej-więcej wygląda tak (pisane 'z palca' za błędy przepraszam):
  1. SET AUTOCOMMIT = 0;
  2. CREATE TEMPORARY TABLE `baza`.`nowa_tabela` (
  3. `ID` int( 11 ) NOT NULL ,
  4. `name` varchar( 30 ) NOT NULL ,
  5. `kolej` float NOT NULL
  6. ) ENGINE = MYISAM;
  7.  
  8. INSERT INTO `baza`.`nowa_tabela` (SELECT *
  9. FROM `baza`.`stara_tabela` WHERE `kolej` >= 1 ORDER BY `kolej`);
  10.  
  11. TRUNCATE TABLE `baza`.`stara_tabela`;
  12.  
  13. INSERT INTO `baza`.`stara_tabela` (SELECT *
  14. FROM `baza`.`nowa_tabela`); COMMIT;
  15. SET AUTOCOMMIT = 1;
  16. DROP TABLE `baza`.`nowa_tabela`;
Black-Berry
dobra przeanalizuję to i poczytam manuale smile.gif dzięki darti jeszcze raz.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.