Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] sortowanie wyników
Zigi
post
Post #1





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 20.11.2004

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


Witam,
mam pewna tabele o takiej strukturze i danych

id | wiersz | kolumna | wartosc | arkusz_id
1|1 |1 | 45|1
2|1|2 |SCV |1
3|1 |3 |423 |1
4|1 |4 |455 |1
5|2 |1 |432 |1
6|2 |2 |BLO |1
7|2 |3 |42 |1
9|3 |1 |453 |1
10|3 |2 |SCV |2
12|3 |3 |453 |2
13|3 |4 |342 |2
14|4 |5 |354 |2
.....................

Jest to zaimportowany arkusz z excela chcialbym to posortowac tak, aby otrzywac w wyniku posortowane wartosci
w taki sposob, że kluczem glownym sortujacym jest testk w 2 kolumnie.
Udało mi się wymyślić takie zapytanie, ale ono nie sortuje tych wyników względem wartosci i 2 kolumny ale reszta jest zwracana tak jak potrzebuję.

  1. SELECT * FROM `obrobka` GROUP BY (`obrobka_kolumna`=2 AND `obrobka_wartosc`), `obrobka_wiersz`, `obrobka_kolumna`


Ma ktos może pomysl jakiej komendy sortujacej uzyc?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
heaven
post
Post #2





Grupa: Nieautoryzowani
Postów: 92
Pomógł: 15
Dołączył: 21.10.2006

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


Zapytanie dziala ale widocznie przy takiej liczbie rekordow jest jeszcze gorsze niz z JOIN'em
Czyli dodajesz to tabeli kolumne:
  1. ALTER TABLE `tabela` ADD COLUMN `sortowanie` VARCHAR(10) AFTER `arkusz_id`;

i zaloz na niej index!!!

Rozumiem ze masz juz jakas baze wiec trzeba teraz we wszystkich rekordach uzupelnic kolumne sortowanie. Mozna to zrobic jednym zapytaniem.
Nie wiem ile ono bedzie sie wykonywalo...
  1. UPDATE tabela t, (SELECT * FROM tabela WHERE kolumna = 2) AS tab
  2. SET t.sortowanie = tab.wartosc
  3. WHERE t.wiersz = tab.wiersz AND t.arkusz_id=tab.arkusz_id

Jesli ta aktualizacja wykonalaby sie w miare szybko to wystarczyloby tylko aktualizowac ta kolumne przed zapytaniem zwracajacym posortowane elementy
To zapytanie sortowania teraz wyglada tak
  1. SELECT * FROM tabela ORDER BY sortowanie, wiersz, arkusz_id, kolumna


Jezeli jednak zapytanie z update'm wszystkich elementow bedzie dlugo trwalo to trzeba teraz przy kazdej modyfikacji jakiegos rekordu updatowac w nim kolumne sortowanie, dla przykladu po zmienie rekordu 13 trzeba by wykonac taka operacje
  1. UPDATE tabela t, (SELECT * FROM tabela WHERE kolumna = 2) AS tab
  2. SET t.sortowanie = tab.wartosc
  3. WHERE t.id = 13 AND t.wiersz = tab.wiersz AND t.arkusz_id=tab.arkusz_id

Nie wiem jak z czasem wykonania tego zapytania i jezeli mimo tego ze chodzi o jeden element jest duzy trzeba go rozbic na 2 zapytania
na poczatku pobrac dane rekordu 13 (wiersz i arkusz_id) a potem zrobic update'a
1)
  1. SELECT wiersz, arkusz_id FROM tabela WHERE id = 13

2) ($wiersz i $arkusz_id sa wartosciami pobranymi z zapytnia 1)
  1. UPDATE tabela t, (SELECT * FROM tabela WHERE wiersz = $wiersz AND arkusz_id = $arkusz_id AND kolumna = 2) AS tab
  2. SET t.sortowanie = tab.wartosc
  3. WHERE t.id = 13

mozna to drugie zapytanie jeszcze bardziej rozbic ale to tylko jesli to by znowu bylo za wolne (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) po rozbiciu napewno bedzie szybkie
czyli: 1) jedynka pozostaje taka sama
2) ($wiersz i $arkusz_id sa wartosciami pobranymi z poprzedniego zapytania)
  1. SELECT wartosc FROM tabela WHERE wiersz = $wiersz AND arkusz_id = $arkusz_id AND kolumna = 2

3) (i ta otrzymana $wartosc wstawiasz do update
  1. UPDATE tabela
  2. SET t.sortowanie = $wartosc
  3. WHERE id = 13


No i jeszcze na koniec metoda wstawiania nowego rekordu zeby od razu byla uzupelniana kolumna sortowanie
Jesli wstawiasz wiersz w ktorym kolumna jest = 2 to wtedy warunek if ustwia kolumne sotowanie na wlasnie podawana wartosc a jesli jesli jest inna niz 2 to szuka wiersza w ktorym jest taki wiersz i arkusz id i kolumna = 2 i pobiera wartosc ktora pozniej wstawi w miejsce sortowania dla nowo dodawaneo wpisu
  1. INSERT INTO tabela (wiersz,kolumna,wartosc,arkusz_id,sortowanie) SELECT $wiersz,$kolumna,$wartosc,$arkusz_id, (SELECT IF($kolumna=2,$wartosc,wartosc) FROM TABLE WHERE wiersz=$wiersz AND arkusz_id=$arkusz_id AND kolumna = 2)

Wazne ze najpierw musisz wstawic rekord z kolumna = 2 i dopiero nastepne ktore maja wiersz i arkusz_id takie same. Jesli nie to musz potem poprawic wszystkie rekordy gdzie bedzie w sortowanie NULL

Mam nadzieje ze cos z tego rozumiesz bo ja coraz mniej (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) w razei czego zapraszam na gg (w profilu)

pozdrawiam...
Go to the top of the page
+Quote Post
Zigi
post
Post #3





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 20.11.2004

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


Kolumne na sortowanie dodalem juz wczoraj i indeks tez od razu zalozylem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Robilem dla testow UPDATE wszystkich wartosci w kolumnie `sortowanie` na jakas wartosc typu 'dfgsdfsdfsdfsfdgdsfs' w tabeli z ok 60 000 rekordow. Przez to, ze mialem zalozony indeks zapytanie wykonywalo sie ok 30-80s w zaleznosci od dlugosci pola `sortowanie`. Gdy pole `sortowanie` mialo zdjety index to samo zapytanie wykonywalo sie 2-10s. Tak sobie pomyslalem czy jest instrukcja, ktrora blokowala by czasowo aktualizowanie indexu na pewnej kolumnie na pewnien czas czyli wygladaloby to mniej wiecej tak:
  1. TABLE `sortowanie` INDEX block

  1. UPDATE tabela t, (SELECT * FROM tabela WHERE kolumna = 2) AS tab SET t.sortowanie = tab.wartosc WHERE t.wiersz = tab.wiersz AND t.arkusz_id=tab.arkusz_id

  1. TABLE `sortowanie` INDEX unblock

  1. TABLE `sortowanie` INDEX UPDATE

Sadze ze takie cos byloby szybsze od aktualizowania indexu po kazdym zapytaniu. Jestem pewnien, ze jest takie polecenie, ale nie moge go znalezc.

Bardzo dziekuje @heaven za komleksowe rozwiazanie problemu. Teraz pozostaje mi przetestowac Twoje zapytania jak beda sie wykonywaly na prawdziwej tabeli.
Go to the top of the page
+Quote Post

Posty w temacie
- Zigi   [MySQL] sortowanie wyników   8.02.2008, 01:40:45
- - nevt   jedynej jaka jest w SQL: ORDER BY ....   8.02.2008, 08:08:06
- - Zigi   Niestety ORDER BY nie potrafie zmusic zeby posorto...   8.02.2008, 14:18:38
- - nevt   [SQL] pobierz, plaintext SELECT * FROM tabela ORDE...   8.02.2008, 14:35:06
- - Zigi   Dzieki @nevt za zainteresowanie, ale niestety to n...   8.02.2008, 14:53:47
- - Indeo   Namieszałeś trochę i nikt teraz nie rozumie Twoic...   8.02.2008, 17:50:33
- - Zigi   Postaram sie jeszcze raz wyjasnic jak maja wyglada...   9.02.2008, 13:16:29
- - heaven   cos mi w tym wyniku nie pasuje bo jest 2 razy inde...   10.02.2008, 20:28:33
- - Zigi   Bardzo przepraszam faktycznie pierwsze wystapienie...   10.02.2008, 23:23:55
- - heaven   Wisisz mi piwo [SQL] pobierz, plaintext SELECT ...   11.02.2008, 11:09:59
- - Zigi   Bardzo Ci dziekuje @heaven za skonstruowanie zapyt...   11.02.2008, 22:03:30
- - heaven   Szczerze wątpie czy uda sie to zrobic bez JOIN. Mo...   11.02.2008, 22:19:30
- - Zigi   Tez nad tym rozwiazaniem, aby dodac ta dodatkowa k...   11.02.2008, 22:45:07
- - heaven   Druga tabela wedlug mnie nic nie wniesie. SELECT w...   11.02.2008, 22:55:29
- - Zigi   Chyba jednak bede musial sie skusic na rozwiazanie...   11.02.2008, 23:14:08
- - heaven   Zobacz to [SQL] pobierz, plaintext SELECT t.id,t.w...   11.02.2008, 23:17:16
- - Zigi   Niesety cos z tym zapytaniem chyba jest nie tak. W...   12.02.2008, 00:07:41
- - heaven   Zapytanie dziala ale widocznie przy takiej liczbie...   12.02.2008, 11:38:55
|- - Zigi   Kolumne na sortowanie dodalem juz wczoraj i indeks...   12.02.2008, 12:43:07
- - heaven   Musialbys chyba zdjac calkiem index i pozniej zalo...   12.02.2008, 13:16:35
- - Zigi   @heaven jestem praktycznie pewnien, ze jest opcja ...   12.02.2008, 16:02:07


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

 



RSS Aktualny czas: 11.10.2025 - 10:46