![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 30.06.2004 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Witam, mam taki oto problem z MySQL'em: robię z kolegą strone o filmach (kinomania), strona działa już od dawna, ale chciałem ją przyśpieszyć, zabajerować i przerobić baze danych na MySQL (wcześniej była w 300+ plikach .txt, a co najlepsze jescze wcześniej była cała w... javascript!). Na php to się w miarę znam, ale w MySQL jestem nowy i ten problem mnie chwilowo załamał.
Mam parę tabel (w tej chwili ważne są users, movie, comment, screen) wszystkie połączone przez odpowiednie pola ID (np. komentarze do filmów są połączone movieid itp). Jednak jeśli chcę wyświetlić, przykładowo tak jak w tym kawałku kodu poniżej użytkowników razem z ich statystykami, to nie umiem zbyt dobrze skonstruować zapytania. Narazie doszłem do tego:
Wszystko jest niby dobrze, ale jeśli jest w bazie użytkownik który nie dodał minimum 1 komentarza , min. 1 filmu i min. 1 screena to go to zapytanie nie zwraca. Problem tkwi w np. 'users.userid = movie.userid', ale nie wiem jak to inaczej napisać. Przykładowo jeśli użytkownik nie ma na koncie żadnego dodanego filmu to w jaki sposób ma ta relacja zwórić true? Wiem, że można by te dane wyświetnić za pomocą wielu zapytań SQL, ale chciałem aby pozostało to bardziej zwięzłe. Mam nadzieje, że nie namieszałem zbytnio jak na swój pierwszy post? W razie problemów mogę dodać tutaj więcej kodu (tworzenie tabel itp), ale nie chciałem zbytnio zaśmiecać forum. Ten post edytował ChanibaL 3.07.2004, 02:05:55 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 548 Pomógł: 2 Dołączył: 19.07.2003 Ostrzeżenie: (0%) ![]() ![]() |
witam ...
wydaje mi sie ze powinno podzialac .... ps. jak cos to zapodaj sql z create tych 4 tabel i ze 2 wiersze ... bedzie mozna potestowac ... pozdrawiam -------------------- Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 30.06.2004 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Nie, niestety chyba zbytnio zamotałem, nie o to chodziło. users.userid!=0 nie jest tutaj istotne.
Pomogłoby raczej coś w tym stylu:
Gdzie:
A teraz duża dawka spamu, czyli kod tworzący tabele:
I krotki zrzut tabeli (bez screenow bo nie zrobilem do tego jescze modulu)
Ten post edytował ChanibaL 4.07.2004, 23:46:26 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 548 Pomógł: 2 Dołączył: 19.07.2003 Ostrzeżenie: (0%) ![]() ![]() |
witam ...
chyba dziala ... ale nie jestem pewien kilku rzeczy ... np. co jest w tabeli screen ![]() pozdrawiam -------------------- Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 30.06.2004 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Dziekuje, wreszcie to zaskoczylo, chociaz kod nie jest zbyt elegancki, zwlaszcza to ciagle /3, ale dziala i to jest najwazniejsze.
Tabela screen to sa screeny (zdjecia) z filmow. EDIT: Niestety, po dokladnym przyjrzeniu sie to jest wciaz nie to co trzeba. screens nie jest dobrze obliczane. Najlepszym wyjsciem bylo by zapytanie to z mojego pierwszego posta, tylko z takim warunkiem, zeby jesli ktos nie mial zadnych screenow (lub komentarzy/filmow itp.) to zeby mu w screens podawalo 0. Teraz to poprostu nie daje nic (stwierdza ze jesli user nie ma screenow, to warunek relacji jest falszywy, i nie daje zadnych danych tego usera). Pozdrawiam Ten post edytował ChanibaL 6.07.2004, 02:38:52 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 548 Pomógł: 2 Dołączył: 19.07.2003 Ostrzeżenie: (0%) ![]() ![]() |
witam ...
hmm ... wlasnie ... ale nie dobrze dziala tylko wynik z tabeli screen .... wiec moze wystarczy dopracowac ![]() pozdrawiam ... -------------------- Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 38 Pomógł: 0 Dołączył: 22.11.2003 Skąd: Sucha Beskidzka Ostrzeżenie: (0%) ![]() ![]() |
Wykonaj wiecj LEFT JOIN zamiast FROM tabela1, tabela2, etc.
LEFT JOIN wykonuje dolaczenie wszystkich pasujacych rekordow z prawej tabeli do lewej, jesli nie ma danych to zwraca wartosc pusta (NULL ?). Powinno dzialac, MySQL jest optymalizowany pod zlaczenia i sam korzystam ze zlaczen nawet na 6-8 tabelach. -------------------- Lukasz
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 295 Pomógł: 7 Dołączył: 26.03.2004 Skąd: Opole Ostrzeżenie: (0%) ![]() ![]() |
Choćbyście na głowie stawali to jeśli nie użyjecie sprzężeń jednostronnych to żadnym warunkiem WHERE nie zmusicie połączonych tabel aby brakujące elementy z jednej z tabel w sprzężeniu zastąpić zerami.
Do tego właśnie służy konstrukcja LEFT JOIN a łączenie tabel na zasadzie: ..... FROM tabela1,tabela2,tabela3 jest niestety metodą przedszkolaków bo chociażby nie pozwala na sprzężenie lewostronne.
Pozatym warto pamiętać że brakujące pola mają wartość NULL - tzn wartość nieznaną i nie wolno w klauzulach WHERE a ni HAVING stosować porównań jak ze zwykłymi wartościami typu WHERE x!=NULL tylko WHERE x IS NOT NULL, bo nie można porównywać czegoś z wartocią nieznaną. -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 30.06.2004 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Nie, niestety to tez jescze nie to. Probowalem z taka sama relacja (co do bajta taka sama, tylko GROUP BY bylo o enter'a wyze
![]() Mozliwe ze nie widac dokladnie do czego jest ta relacja, a to moze troche przeszkadzac. Wiec jest to relacja ktora powinna wczytywac wszystkich uzytkownikow z tabeli users, podawac do kazdego dane ktore wpisal, i relacje właściwą, czyli sumę i średnią punktów z wpisów z tabeli comment które mają to samo userid co w tabeli users, w podobny sposób powinno też wczytywać sumę wpisów w tabelach movie i screen które mają wspólny userid. Wynikiem powinno być więc zestawienie ze statystykami poszczególnych użytkowników. EDIT: wreszcie znalazłem trochę czasu na dokończenie kinomanii, ale wciąż nie mam tej ^$%^ relacji. Chyba poddam się z nią naprawdę. Ten kod powyżej robi naprawde niezłe ciekawostki - przy ~380 wpisach filmów, ~700 komentarzach i ~1000 screenów jednemu użytkownikowi dał pare milionów screenów (miał może 500), a do tego komp mi sie prawie powiesił (mysqld miało 95% zużycia systemu przez dobrą minutę, może dwie!) Pomocy, bo sam to chyba szans nie mam. (coś może pomoże obejrzenie poprzedniej wersji kinomanii - www.hubi.oj.pl/kinomania - wiem że serwis jest troche inny, ale będzie mniej więcej wiadomo jak powinien wyglądać) Ten post edytował ChanibaL 16.07.2004, 16:45:08 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 06:33 |