Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Budowa bazy przyjaciół
Moli
post
Post #1





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


Robię w pewnm projekcie listę przyjaciół. Będzie wyświetlane imie oraz fotka przyjaciół danego profilu. Baze chciałem stworzyć tak:
Kod
USERS
ID | Imie | Photo_ID

PHOTOS
ID | file_name

FRIENDS
USER ID | FRIEND ID


Wpierw pobieram listę ID uzytkowników które odpowiadają podanym kryteriom (czyli czy uzytkownik jest czyims przyjacielem).Następnie pobieran dane użytkownika z tabeli "USERS", z pola "photo_id" pobieram wartość i pobieram z tabeli "PHOTOS" wpis o ID pobranym z pola "photo_id".

Czyli jeśli ktoś będzie miał 10 przyjaciół, będe musiał pobrać 10 profili i 10 zdjęć czyli razem 20 (+1 pobierające liste przyjaciół) zapytań.

Wychodzi trochę dużo, bo przy liczbe przyjaciół np. 500 to będzie aż 1000 zapytań. Jak lepiej zoragnizować to ?

ps. Oczywiście cache będzie ale może istnieje wydajniejsze wyjście.

Ten post edytował Moli 26.01.2008, 14:02:15
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


a JOINy?

  1. SELECT u.imie, u.id, p.filename FROM users u, friends f, photos p WHERE f.user_id = $id_usera_ktorego_przegladasz AND u.id = f.friend_id AND p.id = u.photo_id


znajduszesz friendsow gdzie user id jest id tego usera ktorego przegladasz
dolaczasz info o userach (przyjaciol)
i dolaczasz tabele ze zdjeciami do userow
Go to the top of the page
+Quote Post
Moli
post
Post #3





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


O kurde, zupelnie o tym zapomniałem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Dzięki wielkie :]
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(Moli @ 26.01.2008, 16:00:15 ) *
Kod
USERS
ID | Imie | Photo_ID

PHOTOS
ID | file_name

FRIENDS
USER ID | FRIEND ID

Moim zdaniem masz błąd w strukturze baz danych. Rozumiem, że danemu userowi odpowiada 1 fotka w tabeli photos. W takim razie po co rozbijałeś to na 2 tabele? Wg mnie lepiej (poprawniej) będzie tak:
Kod
USERS
ID | Imie | file_name

FRIENDS
USER ID | FRIEND ID

Teraz trzeba napisać odpowiednie zapytanie SQL, które nie powinno być problemem. Jest tu tylko 1 pułapka: trzeba sprawdzić zarówno pole user_id oraz friend_id (co przeoczył ~dr_bonzo) bo przecież jeśli ktoś zna mnie to zazwyczaj i ja jego znam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Całość wyglądałaby mniej-więcej tak:
  1. SELECT DISTINCT u.id, u.imie, u.file_name FROM friends f LEFT JOIN users u ON (f.user_id=u.id XOR f.friend_id=u.id) ORDER BY u.imie;

DISTINCT aby usunąć ewentualne duble danych.
Go to the top of the page
+Quote Post
Moli
post
Post #5





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


Każdy użytkownik może mieć wiele fotek, nie chodzi mi o avatar o swoje fotki (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Cytat
bo przecież jeśli ktoś zna mnie to zazwyczaj i ja jego znam

Właśnie też o tym pomyślałem, dzięki temu będzie o połowę mniej wpisów w tabli (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował Moli 26.01.2008, 14:29:28
Go to the top of the page
+Quote Post
phpion
post
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(Moli @ 26.01.2008, 16:27:46 ) *
Każdy użytkownik może mieć wiele fotek, nie chodzi mi o avatar o swoje fotki (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

No to muszę Cię zmartwić ale na Twojej obecnej strukturze również tego nie wykonasz:
Kod
USERS
ID | Imie | Photo_ID

PHOTOS
ID | file_name

W jaki sposób chcesz dodać drugie zdjęcie? Gdzie wstawisz ID drugiego zdjęcia? Potrzebujesz w takim razie jeszcze jedną tabelę:
Kod
user_photos: user_id, photo_id

gdzie oba pola łącznie będą stanowić klucz główny, a każde z nich będzie kluczem obcym do odpowiedniej tabeli.
Go to the top of the page
+Quote Post
b_chmura
post
Post #7





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


off topic: phpion i to się nazywają awatary! xD

Ten post edytował b_chmura 26.01.2008, 14:37:08
Go to the top of the page
+Quote Post
Moli
post
Post #8





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


@phpion - Tabela ze zdjęciami wygląda dokladnie tak
Kod
ID | USERID | ALBUMID | FILENAME

Więc jak widzisz można ustawić kilka fotek dla 1 użytkownika (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Nie napisałem jak wygląda cała baza, bo reszta pól nie byla mi potrzebna do tego zapytania (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

ps. Może komuś się przyda, zapytanie jest takie
  1. SELECT DISTINCT u.id, u.login, u.name, u.description, u.main_photo, p.filename FROM photos p , friends f LEFT JOIN users u ON (f.uid=u.id XOR f.fid=u.id) WHERE (f.uid=' . $id . ' XOR f.fid=' . $id . ') AND ( p.id = u.main_photo ) AND ( u.id <> ' . $id . ' ) ORDER BY u.id LIMIT 10


Jednak jest pewien błąd w tym zapytaniu. Jesli bede mial 2 uzytkownikow, jeden o ID = 1 a drugi o ID = 2 i w bazie bedzie wpis
Kod
UDI | FID
1 | 2

To dla użytkownika ID = 1 znajdzie przyjaciela (czyli ID=2), ale już dla użytkownika ID = 2 nie znajdzie nic. Chociaż powinno.

Wie ktoś jaki błąd jest w zapytaniu ? Nie mogę do tego dojść.
Go to the top of the page
+Quote Post
defrag
post
Post #9





Grupa: Zarejestrowani
Postów: 82
Pomógł: 3
Dołączył: 15.01.2007

Ostrzeżenie: (10%)
X----


Cytat(Moli @ 2.02.2008, 10:36:42 ) *
@phpion - Tabela ze zdjęciami wygląda dokladnie tak
Kod
ID | USERID | ALBUMID | FILENAME

Więc jak widzisz można ustawić kilka fotek dla 1 użytkownika (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Nie napisałem jak wygląda cała baza, bo reszta pól nie byla mi potrzebna do tego zapytania (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

ps. Może komuś się przyda, zapytanie jest takie
  1. SELECT DISTINCT u.id, u.login, u.name, u.description, u.main_photo, p.filename FROM photos p , friends f LEFT JOIN users u ON (f.uid=u.id XOR f.fid=u.id) WHERE (f.uid=' . $id . ' XOR f.fid=' . $id . ') AND ( p.id = u.main_photo ) AND ( u.id <> ' . $id . ' ) ORDER BY u.id LIMIT 10


Jednak jest pewien błąd w tym zapytaniu. Jesli bede mial 2 uzytkownikow, jeden o ID = 1 a drugi o ID = 2 i w bazie bedzie wpis
Kod
UDI | FID
1 | 2

To dla użytkownika ID = 1 znajdzie przyjaciela (czyli ID=2), ale już dla użytkownika ID = 2 nie znajdzie nic. Chociaż powinno.

Wie ktoś jaki błąd jest w zapytaniu ? Nie mogę do tego dojść.

Wpisuj do bazy dane o przyjaciolach 2 razy, uwierz mi ze lepiej trzymac sie prostoty, wiec dla usera 1 i 2 robisz dwa rekordy
  1. UDI | FID
  2. 1 2
  3. 2 1

Poza tym dobrze do tabeli users2friends dodac timestamy dla send_at, accepted_at i rejected at jesli chcesz wysylac zaproszenia (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Moli
post
Post #10





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


Wiem w czym był błąd.
  1. AND ( p.id = u.main_photo )

Przez ten kawałek. Jeśli użytkownik nie miał ustawionego głównego zdjęcia to nie znajdywało go. Po rejestracji lub jeśli uzytkownik nie ustawi głównego zdjęcia, wartośc pola main_photo w tabeli users wynosi 0. Myślę że musze w zapytaniu użyć if. Jeśli u.main_photo <> 0 to dopiero wykonuje p.id = u.main_photo. NIestety nie mogę znaleść jak to zrobić, a w manualu mysql, jest to słabo opisane. Wie ktoś jak używać if w mysql ?

ps. Zapytanie wygląda teraz tak
  1. SELECT DISTINCT u.id, u.login, u.name, u.description, u.main_photo, p.filename FROM photos p , friends f LEFT JOIN users u ON (f.uid=u.id OR f.fid=u.id) WHERE (f.uid=' . $id . ' OR f.fid=' . $id . ') AND ( u.id <> ' . $id . ')
Go to the top of the page
+Quote Post
defrag
post
Post #11





Grupa: Zarejestrowani
Postów: 82
Pomógł: 3
Dołączył: 15.01.2007

Ostrzeżenie: (10%)
X----


Cytat(Moli @ 2.02.2008, 11:49:30 ) *
Wiem w czym był błąd.
  1. AND ( p.id = u.main_photo )

Przez ten kawałek. Jeśli użytkownik nie miał ustawionego głównego zdjęcia to nie znajdywało go. Po rejestracji lub jeśli uzytkownik nie ustawi głównego zdjęcia, wartośc pola main_photo w tabeli users wynosi 0. Myślę że musze w zapytaniu użyć if. Jeśli u.main_photo <> 0 to dopiero wykonuje p.id = u.main_photo. NIestety nie mogę znaleść jak to zrobić, a w manualu mysql, jest to słabo opisane. Wie ktoś jak używać if w mysql ?

ps. Zapytanie wygląda teraz tak
  1. SELECT DISTINCT u.id, u.login, u.name, u.description, u.main_photo, p.filename FROM photos p , friends f LEFT JOIN users u ON (f.uid=u.id OR f.fid=u.id) WHERE (f.uid=' . $id . ' OR f.fid=' . $id . ') AND ( u.id <> ' . $id . ')

Ale tu wystarczy left join na p.id = u.main_photo i jak bedzie mial fotke to zwroci jej pola a jak nie nulle
Go to the top of the page
+Quote Post
Moli
post
Post #12





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


No miałeś racje (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Dzięki za pomoc.
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: 23.08.2025 - 08:11