Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> sortowanie z kilku pól
djcinek
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 21.01.2003
Skąd: 51° 25' 0N | 22° 26' 60E | 169 mnpm

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


witajcie.

nikt nie jest wszechwiedzący (poza Wszechwiedzącym), więc i ja piszę, żeby zasięgnąć porady. Oto mój problem:

Przygotowuję stronę, której jedną z głównych części będzie archiwum brytyjskiej listy przebojów z lat 1950-2002, wraz z opisami pierwszego miejsca i komentarzami do wydań. Autor zażyczył sobie (bardzo mądrze, jak myślę), żeby na stronie pojawił się indeks wykonawców. I tu pies pogrzebany.

Oto część tablicy odpowiedzielnej za dane notowań:

[n1_wykonawca_1].[n1_wykonawca_2].[n2_wykonawca_1].[n2_wykonawca_2].[klucz1]

gdzie:
n1_wykonawca_1 - to nazwisko wykonawcy z miejsca 1
n1_wykonawca_2 - to nazwisko wykonawcy z miejsca 1 (w przypadku duetu)
n2_wykonawca_1 - to nazwisko wykonawcy z miejsca 1 w przypadku, gdy na pierwszym miejscu znalazły się dwa single (częste w początkach listy)
n2_wykonawca_2 - analogicznie
klucz - artysta z opisu notowania, na którego autor chce zwrocic uwagę i wymienić go w indeksie.

co potrzeba:

1. wyjąć wszystkich artystów w podanych 5 pól
2. posortować ich

I tu się zaczęły dla mnie schody, bo ORDER BY przy SELECT załatwia mi tylko sortowanie według jednego z pól a nie według zbioru artystów z 5 pól.

i jeżeli mam dane

id1
BBB.CCC.DDD.AAA.EEE
id2
AAA.GGG.WWW.QQQ.AAA

to po przesortowaniu dostane
AAA, GGG, WWW, QQQ, AAA, BBB, CCC, DDD, AAA, EEE

zamiast
AAA, AAA, AAA, BBB, CCC, DDD, EEE, GGG, QQQ, WWW
o co walcze

Macie jakieś pomysły? A może jestem nieukiem i spałem na lekcjach? (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
scanner
post
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Jestes leniem, bo nie poszukals na forum (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
http://forum.php.pl/viewtopic.php?t=949
Myslę, ze to wystarczy (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
dragossani
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 398
Pomógł: 0
Dołączył: --
Skąd: Poznań

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


Scanner, jesteś pewien, że udzieliłeś odpowiedzi na to pytanie? Bo ja nie. Jeśli mamy różne pola i chcemy potraktować je jako 1 pole i posortować (tak zrozumiałem problem) to nie wystarczy ORDER BY i kilka pól po przecinku. Takie coś robi się przez UNION (MySQL 4.0 się kłania) - i najlepiej widok (view) do tego - ale tu już mysql nie pomoże. Postgres się kłania. Ewentualnie php może mysql'a wyręczyć (tablice), choć nie polecam takiego rozwiązania.
Go to the top of the page
+Quote Post
djcinek
post
Post #4





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 21.01.2003
Skąd: 51° 25' 0N | 22° 26' 60E | 169 mnpm

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


Cytat
Scanner, jesteś pewien, że udzieliłeś odpowiedzi na to pytanie? Bo ja nie.


Dokładnie, chodzi o przesortowanie zawartosci kliku pól jakby składały się na jedno. Choroba, co zrobić z tym fantem??
Go to the top of the page
+Quote Post
dragossani
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 398
Pomógł: 0
Dołączył: --
Skąd: Poznań

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


W MySql możesz to zrobić za pomocą klauzuli UNION, ale musisz mieć wersję 4.0 bo we wcześniejszych nie ma tej opcji. UNION grupuje wyniki kilku zapytań tworząc jeden zestaw danych, który można m.in. posrtować. Manual tutaj. Rozsądnym byłoby utworzyć z takiego zapytania widok (View) ale w MySql nie ma na razie takiej możliwości. Do takich zabaw musiałbyś zmienić silnik bazodanowy na Postgres'a.
Możesz też sprawę rozwiązać wrzucając kolejne wyniki zapytań do jednej tablicy w php i potem ją posortować. Co prawda niepotrzebnie obciąża to php ale w ostateczności może być przydatne.

Najprawdopodobniej jednak, wszystkie te zabiegi są zbyteczne. Struktura danych, którą chcesz przechować jest prawdopodobnie na tyle prosta, że po prostu mógłbyś ominąć te problemy. Popełniłeś błędy na etapie projektowania struktury danych i teraz się to mści. Wrzuć wykonawców do jednej tabeli, a odpowiednie zależności utwórz za pomocą powiązań. Problem zniknie sam.
Go to the top of the page
+Quote Post
djcinek
post
Post #6





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 21.01.2003
Skąd: 51° 25' 0N | 22° 26' 60E | 169 mnpm

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


Cytat
(cut)
Do takich zabaw musiałbyś zmienić silnik bazodanowy na Postgres'a.


W zasadzie mam postgres'a na moim vhoscie, chyba bede zmuszony poczytac. Teraz mecze opcje dodawania kolejnych wynikow do wielkiej jak kobyla tablicy, ale niewiele mi z tego poki co wychodzi.

Cytat
Wrzuć wykonawców do jednej tabeli, a odpowiednie zależności utwórz za pomocą powiązań. Problem zniknie sam.


Oj, wiem, ze najprosciej byloby utworzyc oddzielna tablice z samymi artystami, ale to byloby klopotliwe, bo przez 50 lat tych notowan uzbiera sie ich kilka tysiecy, a to bedzie juz skutecznie utrudniac wprowadzanie danych. Druga sprawa... autor wprowadzil do bazy juz ponad 500 notowan z 12 lat. Wydawało się, że z tym indeksem pojdzie z gorki...
Go to the top of the page
+Quote Post
scanner
post
Post #7





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Cytat
Scanner, jesteś pewien, że udzieliłeś odpowiedzi na to pytanie? Bo ja nie.
Tym razem chyba ja się muszę wyspać *
Go to the top of the page
+Quote Post
dragossani
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 398
Pomógł: 0
Dołączył: --
Skąd: Poznań

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


Tak na wstępie chciałbym zwrócić uwagę na precyzję słownictwa. 'Tablice' w bazach danych są - ale nie w MySQLu. Występują np. jako typ pola w Oracle'u. Natomiast to co ty masz na myśli to jest 'relacja' albo potocznie 'tabela', na pewno nie 'tablica'. Może jestem upierdliwy ale głupio byłoby wprowadzić kogoś w błąd.

Kilka tysięcy notowań (powiedzmy 5000) i na każdym powiedzmy 100 wykonawców to jest 500.000 rekordów (a na pewno wyjdzie tego kilkakrotnie mniej bo wykonawcy się powtarzają). To nie jest problem. SELECT z takiej tabeli, nawet lecący po całym indeksie to w MySQLu mniej niż sekunda. Jeśli dobrze zindeksujesz klucze obce do tabeli notowań to przy zapytaniu ze złączeniem engine bazy przytnie odpowiednio zakres przeszukiwanych rekordów - kwestia ułamka sekundy.
Go to the top of the page
+Quote Post
djcinek
post
Post #9





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 21.01.2003
Skąd: 51° 25' 0N | 22° 26' 60E | 169 mnpm

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


dochodzi jeszcze jedna sprawa, a mianowicie wygoda wpisywania. to tez daloby sie jakos opedzic (wyszukiwanie czy nie ma juz danego artysty w bazie i pytanie czy dodac), ale dzis zobaczylem, ze profesor wpisal 590 notowan, wiec chcac nie chcac posadzilem kopie bazy na postgresie i zaczne sie zaraz nad nim pastwic. dzieki za sugestie, szczesciem moj provider chodzi ze mna na piwo...
Go to the top of the page
+Quote Post

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: 24.08.2025 - 04:01