Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dwa klucze obce
Forum PHP.pl > Forum > PHP
brutal1985
Mam następujący problem.

Otóż mam dwie tabele: User (z nazwami użytkowników) i Dzial (z nazwami działów). W tabeli Dzial mam m. in. pola: ID_User (z kluczem obcym odwołującym się do pola ID w tabeli User) oraz ID_User_mod (ID użytkownika, który zmodyfikował dział, z kluczem obcym również odwołującym się do pola ID w tabeli User).

Pytanie: W jaki sposób wyciągnąć dwa razy (lub więcej) z tabeli User: Imię i Nazwisko (tabela User zawiera takie pola), dla różnych ID Usera (jedno dla ID_User - autora działu, a drugie dla ID_User_mod dla osoby, która zmodyfikowała dział)?

Oto mój kod:
  1. <?php
  2. if (isset($_SESSION['login']))
  3. {
  4. include ('db.php');
  5.  
  6. <div class="sortuj">
  7.  
  8. <form method="POST" action="index.php?dzial=panel&link=show_dzial">Sortuj według: &nbsp;
  9. <select name="action">
  10. <option selected="selected">' . $_POST['action'] . '</option>
  11. <option name="tytul_asc" value="Tytułu rosnąco">Tytułu rosnąco</option>
  12. <option name="tytul_desc" value="Tytułu malejąco">Tytułu malejąco</option>
  13. <option name="tresc_asc" value="Treści rosnąco">Treści rosnąco</option>
  14. <option name="tresc_desc" value="Treści malejąco">Treści malejąco</option>
  15. <option name="autor_asc" value="Autora rosnąco">Autora rosnąco</option>
  16. <option name="autor_desc" value="Autora rosnąco">Autora malejąco</option>
  17. <option name="data_utw_asc" value="Daty utworzenia rosnąco">Daty utworzenia rosnąco</option>
  18. <option name="data_utw_desc" value="Daty utworzenia malejąco">Daty utworzenia malejąco</option>
  19. <option name="mod_asc" value="Autora modyfikacji rosnąco">Autora modyfikacji rosnąco</option>
  20. <option name="mod_rejestr_desc" value="Autora modyfikacji malejąco">Autora modyfikacji malejąco </option>
  21. <option name="data_mod_asc" value="Daty modyfikacji rosnąco">Daty modyfikacji rosnąco</option>
  22. <option name="data_mod_desc" value="Daty modyfikacji malejąco">Daty modyfikacji malejąco</option>
  23. </select>';
  24.  
  25.  
  26.  
  27.  
  28. $sql = 'SELECT * FROM `Dzial`, `User` WHERE Dzial.ID_Parent BETWEEN 1 AND 7 AND User.ID = Dzial.ID_User ORDER BY ';
  29. switch ($_POST['action'])
  30. {
  31. case 'Tytułu rosnąco':
  32. $sql .= 'Tytul ASC';
  33. break;
  34. case 'Tytułu malejąco':
  35. $sql .= 'Tytul DESC';
  36. break;
  37. case 'Treści rosnąco':
  38. $sql .= 'Tresc ASC';
  39. break;
  40. case 'Treści malejąco':
  41. $sql .= 'Tresc DESC';
  42. break;
  43. case 'Autora rosnąco':
  44. $sql .= 'ID_User ASC';
  45. break;
  46. case 'Autora malejąco':
  47. $sql .= 'ID_User DESC';
  48. break;
  49. case 'Daty utworzenia rosnąco':
  50. $sql .= 'Data_utw ASC';
  51. break;
  52. case 'Daty utworzenia malejąco':
  53. $sql .= 'Data_utw DESC';
  54. break;
  55. case 'Autora modyfikacji rosnąco':
  56. $sql .= 'ID_User_Mod ASC';
  57. break;
  58. case 'Autora modyfikacji malejąco':
  59. $sql .= 'ID_User_Mod DESC';
  60. break;
  61. case 'Daty modyfikacji rosnąco':
  62. $sql .= 'Data_modyf ASC';
  63. break;
  64. case 'Daty modyfikacji malejąco':
  65. $sql .= 'Data_modyf DESC';
  66. break;
  67. default:
  68. $sql .= 'Tytul ASC';
  69. break;
  70. }
  71.  
  72. echo ' <input type="submit" value="Sortuj" class="button_sortuj">
  73. </form>
  74. </div>';
  75.  
  76. $result = mysql_query($sql);
  77.  
  78. echo '<table class="table_content">
  79. <tr class="table_header">
  80. <td>
  81. Lp.
  82. </td>
  83. <td>
  84. Tytuł
  85. </td>
  86. <td>
  87. Treść
  88. </td>
  89. <td>
  90. Autor działu
  91. </td>
  92. <td>
  93. Data utworzenia
  94. </td>
  95. <td>
  96. Zmodyfikował
  97. </td>
  98. <td>
  99. Data modyfikacji
  100. </td>
  101. </tr>
  102.  
  103. ';
  104.  
  105. $licznik=1; /* liczba porządkowa - zaczynamy od liczby 1*/
  106.  
  107. while ($row = mysql_fetch_assoc($result))
  108. {
  109.  
  110. echo '
  111. <tr>
  112. <td class="table_row_center">
  113. ' . $licznik . '
  114. </td>
  115. <td class="table_row_left">
  116. ' . $row['Tytul'] . '
  117. </td>
  118. <td class="table_row_left">
  119. ' . $row['Tresc'] . '
  120. </td>
  121. <td class="table_row_left">
  122. ' . $row['Imie'] . ' ' . $row['Nazwisko'] .'
  123. </td>
  124. <td class="table_row_center">
  125. ' . $row['Data_utw'] . '
  126. </td>
  127. ';
  128. <td class="table_row_left">';
  129.  
  130. if($row['ID_User_mod']!=NULL)
  131. {
  132. //echo $row['Imie'];
  133. echo $row['ID_User_mod'];
  134. //echo $row['Nazwisko'];
  135. }
  136. else
  137. {
  138. echo' Brak ';
  139. }
  140. echo '
  141. </td>
  142. <td class="table_row_center">';
  143.  
  144. if($row['Data_modyf']!=NULL)
  145. {
  146. echo $row['Data_modyf'];
  147. }
  148. else
  149. {
  150. echo' Brak ';
  151. }
  152. echo '
  153. </td>
  154. </tr> ';
  155.  
  156. $licznik++;
  157. }
  158.  
  159. /* po zakończeniu każdego wiersza z tabeli zwiększamy liczbę porządkową o 1,
  160. aby kolejny wiersz miał większą liczbę porządkową */
  161.  
  162.  
  163. echo'</table>';
  164.  
  165. }
  166. else
  167. {
  168. echo 'Dostęp tylko dla zalogowanych użytkowników! <a href="index.php?dzial=panel" class="blank_link">Zaloguj się</a>';
  169. }
  170. ?>


Chodzi głównie o zapytanie w sql.

  1. $sql = 'SELECT * FROM `Dzial`, `User` WHERE Dzial.ID_Parent BETWEEN 1 AND 7 AND User.ID = Dzial.ID_User AND ORDER BY ';


Może podzielić to na dwa zapytania? Ale w jaki sposób później wstawić obydwa zapytania do jednej tabeli?

Z góry dzięki za pomoc.
tehaha
musisz tutaj użyć LEFT JOIN, będzie to wyglądało mniej więcej tak:
  1. SELECT a.section_id, a.section_title, b.user_id AS mod_id, c.user_is AS author_id FROM section a LEFT JOIN users b ON a.section_mod_id = b.user_id LEFT JOIN users c ON a.section_author_id = c.user_id


- czyli pobieramy dane z tabeli section(dział);
- pierwszy LEFT JOIN pobierze nam dane z tabeli users dla moderatora łącząc id użytkownika z id moderatora
- drugi LEFT JOIN pobierze dane dla autora

- staraj się trzymać jednolitą nomenklaturę albo ang albo pl, lepiej ang;
- zamiast tego pierwszego select lepiej zrobić 2 selecty w pierwszym pole w drugim rosnąco/malejąca, a w <option value trzymać nazwę kolumny, po ktorej sortujesz, pozbędziesz się tak tego switcha bo jest tu nie potrzebny, oczywiście nie zapomnij o walidacji
brutal1985
Dzięki za szybką odpowiedź. Spróbuję zastosować twoje rozwiązanie.

Mam takie zapytanie, ale jest w nim jakiś błąd. Nie mogę go znaleźć .

  1. SELECT a.Dzial_ID, a.Tytul, a.Tresc, a.ID_Modyf, a.ID_Autor, a.Data_utw, a.Data_modyf, a.ID_Parent, b.User_ID AS User_Mod_ID, b.Imie AS Mod_Imie, b.Nazwisko AS Mod_Nazwisko, c.User_ID AS User_Autor_ID, c.Imie AS Autor_Imie c.Nazwisko AS Autor_Nazwisko FROM Dzial a LEFT JOIN User b ON a.ID_Modyf = b.User_Mod_ID LEFT JOIN User c ON a.ID_Autor = c.User_Autor_ID


A jak mam później wyświetlić wyniki?

  1. echo $row['Autor_Imie'];
  2. echo $row['Autor_Nazwisko'];


  1. echo $row['Mod_Imie'];
  2. echo $row['Mod_Nazwisko'];


Już sobie poradziłem. Moje zapytanie wygląda następująco:

  1. SELECT `a`.`Dzial_ID`, `a`.`Tytul`, `a`.`Tresc`, `a`.`ID_Modyf`, `a`.`ID_Autor`, `a`.`Data_utw`, `a`.`Data_modyf`, `a`.`ID_Parent`, `b`.`User_ID`, `b`.`Imie` AS `Mod_Imie`, `b`.`Nazwisko` AS `Mod_Nazwisko`, `c`.`User_ID`, `c`.`Imie` AS `Autor_Imie`, `c`.`Nazwisko` AS `Autor_Nazwisko` FROM `Dzial` AS a LEFT JOIN `User` AS `b` ON `a`.`ID_Modyf` = `b`.`User_ID` LEFT JOIN `User` AS `c` ON `a`.`ID_Autor` = `c`.`User_ID


Dziękuję za pomoc w ukierunkowaniu mnie na właściwe rozwiązanie. Daję "pomógł". Temat można zamknąć.
Pozdrawiam.
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.