![]() |
![]() ![]() |
![]() |
![]()
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 ![]() 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 ![]() Ten post edytował lorix 14.04.2005, 21:37:44 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 26.06.2025 - 20:12 |