Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL] Relacje baz danych wiele do wielu problem z zapytaniem
Forum PHP.pl > Forum > PHP
Muzzi
Witam!

Mam problem z stworzeniem-ułożeniem zapytania do bazy mysql (relacje wiele do wielu).

Moja baza wygląda tak:

  1. CREATE TABLE `cms_users` (
  2. `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `login` varchar(16) NOT NULL DEFAULT '',
  4. `pass` varchar(40) NOT NULL DEFAULT '',
  5. `email` varchar(150) NOT NULL DEFAULT '',
  6. `name` varchar(255) NOT NULL DEFAULT '',
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
  9.  
  10.  
  11. CREATE TABLE `cms_group` (
  12. `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  13. `name` varchar(255) NOT NULL DEFAULT '',
  14. PRIMARY KEY (`id`)
  15. ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
  16.  
  17. CREATE TABLE `cms_user_has_group` (
  18. `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  19. `userId` int(11) UNSIGNED NOT NULL,
  20. `groupId` int(11) UNSIGNED NOT NULL,
  21. PRIMARY KEY (`id`)
  22. ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;


Mianowicie w cms_users są loginy oraz unikalne id usera, w cms_group są nazwy grup oraz unikalne id grupy a w cms_user_has_group znajduje się informacja jaki id usera należy do grupy.

Pseudo kod, którym chciałem coś wykombinować
  1. $query15 = "SELECT * FROM `cms_group`";
  2. $checkquery15 = mysql_query( $query15 ) or die( mysql_error() );
  3.  
  4. $query16 = "SELECT * FROM `cms_user_has_group` WHERE userId = '.$id.'";
  5. $checkquery16 = mysql_query( $query16 ) or die( mysql_error() );
  6.  
  7. echo '<br /><form><td>';
  8.  
  9. while( $data = mysql_fetch_array( $checkquery15 ) )
  10. {
  11. while( $data2 = mysql_fetch_array( $checkquery16 ) )
  12. {
  13. if( $data[ 0 ] == $data2[ 2 ] ){
  14. $wstaw = "checked='checked'";
  15. }
  16. else
  17. {
  18. $wstaw = '';
  19. }
  20. echo '<input type="checkbox" '.$wstaw.' />'.$data[ 1 ].'<br /> ';
  21. }
  22. }
  23. echo '</td></form>';



Wygląd przykładowy tabel:

cms_group:

+--------------+---------+

| id | name |

+--------------+---------+

| 1 | Grupa 1 |

| 2 | Grupa 2 |

| 3 | Grupa 3 |

+--------------+---------+

cms_user_has_group:


+--------------+---------+---------+

| id | userId | groupId |

+--------------+---------+---------+

| 1 | 1 | 1 |

| 2 | 1 | 2 |

| 3 | 2 | 3 |

+--------------+---------+----------+

Ostatnia tabela ukazje iż:
- user o id 1 należy do grupy o id 1;
- user o id 1 należy do grupy o id 2;
- user p id 2 należy do grupy o id 3;


A więc mój problem zaczyna się tutaj. Chcę wypisać wszystkie grupy jakie są w tabeli cms_group ale.. dodatkowo, jeżeli użytkownik należy do jakiejś grupy niech checkbox będzie zaznaczony, oraz abym mógł łatwo pobrać id z formularza, gdyż przyda mi się to do wykonania UPDATE w celu edytowania czy użytkownik należy do danej grupy. ( Użytkownik może należeć do kilku grup, albo nie należeć do żadnej )

Z góry dziękuję za jaką kolwiek pomoc.

Pozdrawiam
Muzzi
erix
Zrób zwykłego joina i sprawdzaj, czy dla danego rekordu istnieją pola z tabeli grup (jeśli nie przekombinujesz, to zwróci Ci null, ale to pozostawiam Tobie, którego joina użyć wink.gif).
Muzzi
A propo Join'a to wiem. To jest oczywiste, iż mam go użyć, lecz prosiłbym o jaką kolwiek wskazówkę. Niedawno zacząłem zabawę z MYSQL wink.gif
erix
Popróbuj, my skomentujemy. To nie jest dział z gotowcami. A wskazówkę dostałeś. tongue.gif
Muzzi
A więc na pierwszy ogień idzie mój pomysł który nie chciał działać, powód? -Błąd.

  1. SELECT `cms_users.name`, `cms_group.name`
  2. FROM `cms_user_has_group`, `cms_users`, `cms_group`
  3. LEFT JOIN `cms_users` ON `cms_users`.`id` = 'cms_user_has_group.userId'
  4. RIGHT JOIN `cms_group` ON `cms_group`.`id` = 'cms_user_has_group.groupId'
  5. ORDER BY `cms_group.id`


Wyrzuca mi:
#1066 - Not unique table/alias: 'cms_users'
nospor
Przecież ci napisano:
nieunikalna nazwa tabeli. Używasz tabeli cms_users dwukrotnie i myślisz ze mysql się sam domyśli kiedy masz na myśli pierwsze odwołanie a kiedy drugie? Nie, nie domyśli się.

Musisz użyć aliasów. W manualu mysql masz napisane co i jak jeśli jeszcze nie wiesz.

ps: a po co w ogóle dałeś cms_users we FROM? To jest tam totalnie zbędne. Wywal, to nie będziesz miał już błędu co masz. Analogicznie z cms_group
Muzzi
No to kolejna próba wink.gif

  1. SELECT `cms_users`.`name`, `cms_group`.`name`
  2. FROM `cms_user_has_group`
  3. LEFT JOIN `cms_users` ON `cms_users`.`id` = 'cms_has_group.userId'
  4. RIGHT JOIN `cms_group` ON `cms_group`.`id` = 'cms_has_group.groupId'
  5. ORDER BY `cms_group`.`id`


Zwraca:
name name
NULL Grupa 1
NULL Grupa 2
nospor
nie:'cms_has_group.userId'
a:`cms_has_group`.`userId`
No patrz co piszesz....szczegolnie ze wcześniej używales tego poprawnie :/
Muzzi
Zobacz, męczyłem się troszkę z tym błędem wink.gif

  1. SELECT `cms_users`.`id`, `cms_group`.`name`
  2. FROM `cms_user_has_group`
  3. LEFT JOIN `cms_users` ON `cms_users`.`id` = `cms_has_group`.`userId`
  4. RIGHT JOIN `cms_group` ON `cms_group`.`id` = `cms_has_group`.`groupId`
  5. ORDER BY `cms_group`.`id`


Error:
#1054 - Unknown column 'cms_has_group.userId' in 'on clause'
nospor
No ale we FROM dajesz cms_user_has_group a później ni stąd nie zowąd korzystasz z cms_has_group.
erix
A możesz przestać robić na pałę i czekać na poprawki od nas?

Przeczytaj *uważnie* jeszcze raz, co napisałeś i treść błędu, inaczej zamykam temat, bo bezczelnie tracisz nasz czas.
Muzzi
Przepraszam, za swoje głupie błędy, ale dopiero sie uczę, mam nadzieję, iż rozumiecie.

  1. SELECT `cms_users`.`id`, `cms_group`.`name`
  2. FROM `cms_user_has_group`
  3. LEFT JOIN `cms_users` ON `cms_users`.`id` = `cms_user_has_group`.`userId`
  4. RIGHT JOIN `cms_group` ON `cms_group`.`id` = `cms_user_has_group`.`groupId`
  5. ORDER BY `cms_group`.`id`


Zwróciło:
id name
1 Grupa 1
2 Grupa 1
1 Grupa 2

Działa, zwraca wszystkie grupy i użytkowników którzy należą do niej. Chciałbym tutaj dodać warunek- podaję id ( usera ) i znajduję wszystkie grupy w których należy a jeżeli nie należy to powinno zwrócić NULL.

@Edit:
  1. SELECT `cms_group`.`name`
  2. FROM `cms_user_has_group`
  3. LEFT JOIN `cms_users` ON `cms_users`.`id` = `cms_user_has_group`.`userId`
  4. RIGHT JOIN `cms_group` ON `cms_group`.`id` = `cms_user_has_group`.`groupId`
  5. WHERE `cms_users`.`id` = '3'


Podane losowe id przy WHERE. Działa dobrze, lecz.. gdy użytkownik nie należy do żadnej grupy nie zwróci nic. Czyli w kodzie PHP pętla while nie wykona się ani raz, przez co nie wypisze grup.
erix
A co ja pisałem o rodzajach joinów?
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.