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 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 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 smile.gif Pytanie tylko czy to jest rozwiązanie optymalne ?