Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jedno array dla danego id
Forum PHP.pl > Forum > Bazy danych > MySQL
MGie
Męczę się już z tym jakiś czas i za bardzo nie wiem jak to zrobić w MySQL,
chciałbym połączyć 3 tabele: users, users_in_groups, users_groups,

chciałbym aby return array wyglądał tak:
  1. array (
  2. [0] => array(
  3. 'user_id' => 3,
  4. 'user_name' => 'Jan',
  5. 'user_in_groups' => array(
  6. [0] => array(
  7. 'group_id' => 1,
  8. 'group_name' => 'admin',
  9. )
  10. )
  11. )
  12. )


Mam kod:
  1. CREATE OR REPLACE VIEW view_users_in_groups AS
  2. SELECT u.id AS user_id, u.name AS user_name, u.email AS user_email, ug.id AS group_id, ug.name AS group_name, ug.alias group_alias FROM users u, users_groups ug, users_in_groups uig
  3. WHERE
  4. u.id = uig.user_id
  5. AND
  6. ug.id = uig.group_id;

Zwraca:
  1. array(3) {
  2. [0]=>
  3. object(stdClass)#28 (6) {
  4. ["user_id"]=>
  5. string(1) "5"
  6. ["user_name"]=>
  7. string(6) "Michal"
  8. ["user_email"]=>
  9. string(17) "mail@gmail.com"
  10. ["group_id"]=>
  11. string(1) "1"
  12. ["group_name"]=>
  13. string(5) "admin"
  14. ["group_alias"]=>
  15. string(6) "admins"
  16. }
  17. [1]=>
  18. object(stdClass)#27 (6) {
  19. ["user_id"]=>
  20. string(1) "5"
  21. ["user_name"]=>
  22. string(6) "Michal"
  23. ["user_email"]=>
  24. string(17) "mail@gmail.com"
  25. ["group_id"]=>
  26. string(1) "3"
  27. ["group_name"]=>
  28. string(9) "moderator"
  29. ["group_alias"]=>
  30. string(9) "moderator"
  31. }
  32. [2]=>
  33. object(stdClass)#26 (6) {
  34. ["user_id"]=>
  35. string(1) "5"
  36. ["user_name"]=>
  37. string(6) "Michal"
  38. ["user_email"]=>
  39. string(17) "mail@gmail.com"
  40. ["group_id"]=>
  41. string(1) "4"
  42. ["group_name"]=>
  43. string(7) "writers"
  44. ["group_alias"]=>
  45. string(6) "writer"
  46. }
  47. }



W takim układzie mam utrudniony odbiór danych, nie użyję pętli foreach ( zwróci 3 razy to samo, z innymi grupami ).
Mam jeszcze problem z użytkownikami, którzy nie należą do żadnej z grup, chciałbym mieć ich też w tym widoku ( chyba najlepiej by było, żeby ich user_in_groups był NULL a nie array ).
trueblue
Jeśli id użytkownika jest inne niż poprzednie, tzn. że jest to nowa grupa, jeśli takie same, jesteśmy w kolejnym rekordzie podrzędnym.
Wystarczą odpowiednie warunki w pętli for (przy "odbiorze danych").

http://www.w3schools.com/sql/sql_join_left.asp
MGie
W sumie mogę tak to w PHP zaimplementować,
czy zawsze będą te same user_id obok siebie?
Nie potrzeba GROUP BY / ORDER BY ?

Mam problem z LEFT JOINem,
jeżeli dobrze rozumiem to funkcja zwraca całą lewą tabelę, z pasującymi wierszami z prawej..
Mam taki kod:
  1. SELECT u.id, uig.group_id FROM users u, users_in_groups uig
  2. LEFT JOIN users ON users.id = uig.user_id


Czyli rezultatem powinny być id wszystkich użytkowników i grupy do których należą ( jeżeli należą ).

Jednak zwraca mi wszystkich użytkowników przypisanych do wszystkich grup.
trueblue
Tak, ORDER BY.

W zapytaniu występuje dwa razy tabela users.
W LEFT JOIN ma być tabela, w której może "brakować" rekordów.
MGie
Gdy nie podam users we FROM mam błąd:
Kod
#1054 - Unknown column 'users.id' in 'on clause'


w ten sposób, też nie działa:
  1. SELECT uig.user_id, uig.group_id FROM users_in_groups uig, users
  2. LEFT JOIN users_in_groups ON users_in_groups.user_id = users.id

Wyświetla tylko użytkownik którzy są w jakiejś grupie ( OK było by pół zapytania, jakbym dołożył do tego resztę users ) ale po kilka razy...
trueblue
  1. SELECT u.id, uig.group_id FROM users AS u
  2. LEFT JOIN users_in_groups AS uig ON uig.user_id = u.id
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.