Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [updated] Dwie tabele, chyba trudne :)
lorix
post
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 14.04.2005

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


Hej

Mam taki problem:

Są dwie tabele jedna users, druga friends:

users(id_users, access, last_message_date)
friends(id_friends, id_user_parent, id_user_friend)

users.access jeśli równe 1 mówi że wiadomości są dostępne dla wszystkich, jeśli równe 2 to są dostępne tylko jeśli user należy do friends innego usera.

Sytuacja:

Załóżmy że w tabeli users jest 5 userów (user1, user2, ...) i userzy od 1 do 4 mają access=1, user5 ma access=2 i do friends ma przypisane user2

Potrzebuje zapytanie które poda mi listę userów posortowaną względem last_message_date oraz na podstawie users.access i tabeli friends tak ułoży listę by zostały wyświetlone wiadomości dostępne dla konkretnego usera.

Czyli - dla usera1 powinna być lista od user1 do user4
dla usera2 lista od user1 do user5

Przeglądałem wiele for ale niestety nie znalazłem rozwiązania (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)

Kiedyś poradziłem sobie tak że tabela users zawierała pole blob friends z kluczami oddzielonymi znakiem | i przy pomocy odpowiedniego REGEXP w zapytaniu wszystko działało, jednak pomyślałem sobie że to mało eleganckie rozwiązanie więc dane z tego pola rozbiłem do osobnej tabeli.

Próbowałem coś takiego, jednak to wyświetla wszystkie klucze userów (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)

SELECT users.* FROM users LEFT JOIN friends ON (friends.id_user_parent=users.id_users AND users.access=2 AND friends.id_user_friend=$id_zalogowanego) ORDER BY users.last_message_date DESC

Próbowałem jeszcze tak:

SELECT users.* FROM users,friends WHERE (users.access=2 AND friends.id_user_friend=users.id_users AND friends.id_user_friend=$id_zalogowanego) OR (users.access=1) ORDER BY users.last_message_date DESC

To zapytanie niestety "zamulało" serwer i po paru minutach zwracało błąd (w bazie kilkadziesiąt tysięcy rekordów).

Może ma ktoś jakiś pomysł ?

Pozdrawiam

Edit:

Wymyśliłem coś takiego:

CREATE TEMPORARY TABLE list SELECT users.id_users FROM users INNER JOIN friends ON friends.id_user_parent=users.id_users AND users.access=2;
CREATE INDEX temp ON list (id_users);
SELECT users.* FROM users,list WHERE (list.id_users=users.id_users OR users.access=1) GROUP BY users.id_users ORDER BY users.last_message_date DESC;
DROP TABLE list;

Wygląda na to że działa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Pytanie tylko czy to jest rozwiązanie optymalne ?

Ten post edytował lorix 14.04.2005, 21:37:44
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: 22.08.2025 - 23:37