Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie rekordów z 3 tabel jednocześnie.
Forum PHP.pl > Forum > Bazy danych > MySQL
starach
Witam.
Piszę mini centrum projektowe.
W menu po prawej stronie mam podział na Nazwa_Projektu->Klasy->Metody i jeszcze kilka dodatkowych linków w tym momencie nieistotnych. Te trzy elementy mam w bazie. Są one w 3 tabelach.
każda klasa ma pole project_id celem identyfikacji do którego projektu jest potrzebna i analogicznie każda metoda ma pole class_id również celem identyfikacji. Kiedy policzyłem spodziewaną ilość zapytań przy 3 projektach około 10 klasach na każdy i na dodatek metodach to mało nie posiwiałem. Jak mam skonstruować zapytanie aby pobrać potrzebne mi dane i móc je potem jakoś sensownie posegregować ?
bigZbig
Wiesz łatwiej by było gdybyś przedstawił choćby najprosciej schemat swoich tabel np.

tabela1: pole1 | pole2 | pole3
tabela2: poleA | poleB | poleC

i poda które pola to klucze, a które to klucze obce. Tak na szybcika to Ci moge jedynie podpowiedziec LEFT JOIN lub INNER JOIN
starach
  1. /*Table structure for table `class` */
  2.  
  3. DROP TABLE IF EXISTS `class`;
  4.  
  5. CREATE TABLE `class` (
  6. `id` int(5) NOT NULL AUTO_INCREMENT,
  7. `name` varchar(255) DEFAULT NULL,
  8. `allowed_groups` varchar(255) DEFAULT NULL,
  9. `last_update` varchar(15) DEFAULT NULL,
  10. `project_id` int(5) DEFAULT NULL,
  11. PRIMARY KEY (`id`)
  12. ) ENGINE=InnoDB DEFAULT CHARSET=latin2;
  13.  
  14. /*Table structure for table `method` */
  15.  
  16. DROP TABLE IF EXISTS `method`;
  17.  
  18. CREATE TABLE `method` (
  19. `id` int(5) NOT NULL AUTO_INCREMENT,
  20. `name` varchar(35) DEFAULT NULL,
  21. `content` blob,
  22. `parameters` blob,
  23. `class_id` int(5) DEFAULT NULL,
  24. PRIMARY KEY (`id`)
  25. ) ENGINE=InnoDB DEFAULT CHARSET=latin2;
  26.  
  27. /*Table structure for table `project` */
  28.  
  29. DROP TABLE IF EXISTS `project`;
  30.  
  31. CREATE TABLE `project` (
  32. `id` int(5) NOT NULL AUTO_INCREMENT,
  33. `name` varchar(255) DEFAULT NULL,
  34. `allowed_groups` varchar(255) DEFAULT NULL,
  35. `last_update` varchar(15) DEFAULT NULL,
  36. `visible` int(1) DEFAULT NULL,
  37. PRIMARY KEY (`id`)
  38. ) ENGINE=InnoDB DEFAULT CHARSET=latin2;


edit>
Przeczytałem o inner join i left join nawet wykonałem przykłady zamieszczone w artykule i mój problem byłby juz rozwiązany gdyby nie to że nie wiem jak mam to zastosować do trzech tabel jednocześnie.
Norbas
Spróbuj:
  1. SELECT p.name,c.name,m.name
  2. FROM `project` AS p
  3. LEFT JOIN `class` AS c ON c.project_id=p.id
  4. LEFT JOIN `method` AS m ON m.class_id=c.id
starach
  1. mysql> SELECT p.name,c.name,m.name
  2. -> FROM `project` AS p
  3. -> LEFT JOIN `class` AS c ON c.project_id=p.id
  4. -> LEFT JOIN `method` AS m ON m.class_id=c.id;
  5. +--------+----------+---------+
  6. | name | name | name |
  7. +--------+----------+---------+
  8. | Trader | MySQL | connect |
  9. | Trader | MySQL | query |
  10. | Trader | Category | NULL |
  11. | Trader | Form | NULL |
  12. | CMS | MySQL | NULL |
  13. | CMS | User | NULL |
  14. +--------+----------+---------+
  15. 6 rows in set (0.00 sec)


Bardzo ale to bardzo fajnie biggrin.gif Tylko jak mam teraz odwołać się do tych pól z tablicy asocjacyjnej ?
I jaką byście polecili mi książkę o MySQLu ewentualnie jeszcze książkę uzupełniającą wiedzą z
php i MySQL - Wydanie trzecie Vademecum profesjonalisty ( lakoniczna i nuda teoretyczna teoria )
PHP4 i MySQL - Dla webmastera to łatwe ( Całkiem przystępna treść ale kompletnie zdeaktulizowana a o Obiektowym php to są tam 3 linijki )
php - leksykon funkcji
Co byście mi poradzili do tego zestawu bo chcę posiąść o wiele większą widzę o tworzeniu stron internetowych przy wykorzystaniu tych technologii.
Edit>
Dobra cofam ostatnie pytanie to nie miejsce na takie pytania jednak jeśli ktoś miałby jakąś propozycję odnośnie książki lub strony którą powinienem przestudiować to proszę o pw. Dzięki. Więc chciałbym się dowiedzieć tylko jak mam uzyskać do wartości za tablicy asocjacyjnej z poziomu php zwróconą przez powyższe zapytanie.

Edit>>
Dziwne ale nie działa.

Wykonuję kod:
  1. <?php
  2. $this->db->query('SELECT *
  3. FROM `project` AS p
  4. LEFT JOIN `class` AS c ON c.project_id=p.id
  5. LEFT JOIN `method` AS m ON m.class_id=c.id '
  6. );
  7. while(($row = mysqli_fetch_assoc($this->db->sql_result)) !== NULL)
  8. {
  9.  foreach($row as $key => $val)
  10. {
  11. echo "$key => $val ";
  12. }
  13. echo " ".'<br><hr><br>'." ";
  14. }
  15. ?>

Zwracam mi:
  1. id => 1
  2. name => connect
  3. allowed_groups => administrator
  4. last_update =>
  5. visible => 0
  6. project_id => 1
  7. content =>
  8. parameters =>
  9. class_id => 1
  10.  
  11. <br><hr><br>
  12.  
  13. id => 2
  14. name => query
  15. allowed_groups => administrator
  16. last_update =>
  17. visible => 0
  18. project_id => 1
  19. content =>
  20. parameters =>
  21. class_id => 1
  22.  
  23. <br><hr><br>
  24.  
  25. id =>
  26. name =>
  27. allowed_groups => administrator
  28. last_update =>
  29. visible => 0
  30. project_id => 1
  31. content =>
  32. parameters =>
  33. class_id =>
  34.  
  35. <br><hr><br>
  36.  
  37. id =>
  38. name =>
  39. allowed_groups => administrator
  40. last_update =>
  41. visible => 0
  42. project_id => 1
  43. content =>
  44. parameters =>
  45. class_id =>
  46.  
  47. <br><hr><br>
  48.  
  49. id =>
  50. name =>
  51. allowed_groups => administrator
  52. last_update =>
  53. visible => 0
  54. project_id => 2
  55. content =>
  56. parameters =>
  57. class_id =>
  58.  
  59. <br><hr><br>
  60.  
  61. id =>
  62. name =>
  63. allowed_groups => administrator
  64. last_update =>
  65. visible => 0
  66. project_id => 2
  67. content =>
  68. parameters =>
  69. class_id =>
  70.  
  71. <br><hr><br>
sf
Cytat
( tylko ci się wydaje że trzeba po przecinku nazwy wymienić )

...

  1. SELECT p.*, c.name AS className, m.name AS methodName ...
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.