Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: sortowanie z kilku pól
Forum PHP.pl > Forum > Bazy danych > MySQL
djcinek
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? sad.gif
scanner
Jestes leniem, bo nie poszukals na forum tongue.gif
http://forum.php.pl/viewtopic.php?t=949
Myslę, ze to wystarczy smile.gif
dragossani
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.
djcinek
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??
dragossani
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.
djcinek
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...
scanner
Cytat
Scanner, jesteś pewien, że udzieliłeś odpowiedzi na to pytanie? Bo ja nie.
Tym razem chyba ja się muszę wyspać *
dragossani
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.
djcinek
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...
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.