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

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

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
