Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sortowanie tabeli MySQL raz jeszcze
Black-Berry
post 13.06.2007, 10:56:10
Post #1





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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źć ?

Ten post edytował Black-Berry 13.06.2007, 11:09:46


--------------------
Go to the top of the page
+Quote Post
kszychu
post 13.06.2007, 11:01:06
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 712
Pomógł: 23
Dołączył: 27.10.2003
Skąd: z kontowni

Ostrzeżenie: (0%)
-----


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.


--------------------
"Coś się kończy, coś się zaczyna." Andrzej Sapkowski
Go to the top of the page
+Quote Post
Black-Berry
post 13.06.2007, 11:08:18
Post #3





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Black-Berry 13.06.2007, 11:10:37


--------------------
Go to the top of the page
+Quote Post
Darti
post 13.06.2007, 11:18:39
Post #4





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

Ostrzeżenie: (0%)
-----


  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`)


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
Black-Berry
post 13.06.2007, 13:37:47
Post #5





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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;?

Ten post edytował Black-Berry 13.06.2007, 13:38:05


--------------------
Go to the top of the page
+Quote Post
nospor
post 13.06.2007, 13:43:00
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Black-Berry
post 13.06.2007, 14:51:12
Post #7





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Black-Berry 13.06.2007, 14:53:31


--------------------
Go to the top of the page
+Quote Post
Darti
post 13.06.2007, 15:15:00
Post #8





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

Ostrzeżenie: (0%)
-----


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`;


Ten post edytował Darti 13.06.2007, 15:20:26


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
Black-Berry
post 13.06.2007, 16:47:09
Post #9





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


dobra przeanalizuję to i poczytam manuale smile.gif dzięki darti jeszcze raz.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 12.06.2025 - 15:55