![]() |
![]() |
![]()
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) |
|
|
![]() |
![]()
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) |
|
|
![]()
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.
|
|
|
![]()
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?? |
|
|
![]()
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. |
|
|
![]()
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... |
|
|
![]()
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ć *
|
|
|
![]()
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. |
|
|
![]()
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...
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 04:01 |