Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Łączenie zapytań i pętla while
Forum PHP.pl > Forum > Bazy danych > MySQL
sorex
Witam.

Mam dwie różne tabele:

cena
-----------------------
id | wartosc |
-----------------------
1 | cena 1 |
2 | cena 2 |
3 | cena 3 |
4 | cena 4 |

terminy
--------------------------------------
|id | rok | nazwa | ilosc_miejsc |
--------------------------------------
| 1 | 2013| term1 | 2 |
| 2 | 2013 | term2| 1 |
| 3 | 2013 | term3 | 4 |
| 4 | 2013 | term4 | 4 |





Chciałbym wyświetlić na stronie wszystkie terminy z tabeli "terminy" (np. pętlą while) ale dodatkowo, żeby przy każdym wyświetlonym terminie była jeszcze podana cena np.

--------------------------------------------
Termin: term1
---------------------------------------------
Ilość Wolnych miejsc: 2
---------------------------------------------
Cena: cena 2
---------------------------------------------

Mam taki kod:

  1. mysql_connect("*********", "**********", "***********") or die(mysql_error());
  2. mysql_select_db("***************") or die(mysql_error());
  3. $data = mysql_query("SELECT * FROM terminy JOIN cena WHERE (terminy.rok = '2013') ORDER BY terminy.id")
  4. or die(mysql_error());
  5.  
  6.  
  7. while($dane=mysql_fetch_array($data))
  8. {
  9.  
  10. ?>
  11.  
  12. <table bgcolor="#2E2B2B" border=1 cellpadding=4 width=580>
  13. <tr>
  14. <th width=60><font color="#F00000" size="2px">Termin:</font></th> <td width=270 align="left"><font color="#FFD200" size="2px"><b> <?php echo $dane['nazwa']; ?></b></font></td>
  15. <td><font color="#F00000" size="2px">Ilość wolnych miejsc:</font><font color="#FFD200" size="3px"><b><?php echo $dane['ilosc_miejsc']; ?></b> Cena: <?php echo $dane['wartosc']; ?>
  16. </tr>
  17.  
  18.  
  19. </table>


Wiem, że w zapytaniu SQL jest błąd bo wyświetla mi ilość wierszy z tabeli "terminy" razy ilość wierszy z tabeli "cena".
Czy ktoś mógłby mnie naprowadzić na właściwy tor?
nospor
No a po jakim niby polu łączą się te obie tabele?
sorex
No właśnie sęk w tym że nie wiem jak je połączyć.

Czy da radę id.cena = ilosc_miejsc.terminy ?
Ilość terminów będzie stała. Ilość Cen również.
nospor
Ja się ciebie najpierw pytam po jakim polu tu cchiałbys je łączyc...... nie rozumiesz prostego pytania? No w jakiś logiczny sposób rekord z tabeli pierwszej jest powiazany z rekordem z tabeli drugiej. I o to logiczne powiązanie się ciebie pytam, bo póki co tego nie widac

Cytat
Czy da radę id.cena = ilosc_miejsc.terminy ?
Ty tak na poważnie? A co ma cena do terminu?

Cytat
Ilość terminów będzie stała. Ilość Cen również.
Czyli co? Pole ID z pierwszej tabeli będzie odpowiadać polu ID z drugiej tabeli? No to łącz po ID
sorex
Nie mogę łączyć po ID ponieważ ilośc wolnych miejsc jest zmienna.
Zrobiłem takie zapytanie, jednak w dalszym ciągu nie działa jak powinno.
  1. "SELECT * FROM terminy LEFT JOIN ilosc_osob ON ilosc_osob.id=terminy.ilosc_miejsc ORDER BY terminy.id"
nospor
....
A co ma ID z jednej tabeli do ilosci miejsc z drugiej tabeli?? No pomyśl trochę co ty wypisujesz :/

Jeśli w twojej logice, ID z obu tabel łączą się ze sobą, to i masz to w zapytaniu zrobić
..... ON ilosc_osob.id=terminy.id......
i już.
ALe to przy założeniu, że ID odpowiadają sobie nawzajem. Na dobrą sprawę ze wszystkich pól co tu masz to tylko to może być łączone po ID.
sorex
Wydaje mi się, że mogę połączyć ID z Ilością osób.

W tabeli ceny jest id (od 1 -14)
W tabeli Terminy jest (1 -14 ilość osób )
To się nie zmieni (w obu tabelach nie zmieni się ilość wierszy). Zmieniać się będzie tylko ilośc_miejsc.

Czy w dalszym ciągu źle myślę? Bo chyba musze się wrócić do Przedszkola :/
nospor
No jesli liczba osób jest odpowiednikiem ID z tabeli ceny.... to tak, możesz tak łączyć. Aczkolwiek nazewnictwo tych kolumn wskazuje że tak być nie może.

Kurcze, chlopie, sprawa jest banalnie prosta: to ty tworzyłes te tabele?

Jeśli tak, to nie wiesz po co to tworzyles i z czym masz to łączyc?
Jeśli nie ty to tworzyłeś to faktycznie idzie tylko zgadywać co jest czym.
sorex
No poplątałem się chyba we wszystkim ale już jestem na prostej.
Zrobiłem to w ten sposób (nie wiem czy może tak zostać):
  1. <?php
  2. // Connects to your Database
  3. mysql_connect("88888", "888888888", "888888") or die(mysql_error());
  4. mysql_select_db("8888888888888") or die(mysql_error());
  5. $data = mysql_query("SELECT * FROM terminy LEFT JOIN ilosc_osob ON ilosc_osob.id=terminy.id ORDER BY terminy.id")
  6.  
  7.  
  8. while($dane=mysql_fetch_array($data))
  9. {
  10.  
  11.  
  12. ?>
  13.  
  14. <table bgcolor="#2E2B2B" border=0 cellpadding=4 width=580>
  15. <tr>
  16. <th width=60><font color="#F00000" size="2px">Termin:</font></th> <td width=270 align="left"><font color="#FFD200" size="2px"><b> <?php echo $dane['nazwaPL']; ?></b></font></td>
  17. <td><font color="#F00000" size="2px">Iloć wolnych miejsc:</font><font color="#FFD200" size="3px"><b><?php echo $dane['ilosc_miejsc_wolnych']; ?></b>
  18. </tr>
  19.  
  20. <tr>
  21. <td colspan=2></font>
  22.  
  23. <form action=podsumowanie.php method=GET>
  24. <?php
  25.  
  26. $liczba = $dane['ilosc_miejsc_wolnych'];
  27. mysql_connect("888888888", "8888888888", "888888888") or die(mysql_error());
  28. mysql_select_db("8888888888") or die(mysql_error());
  29.  
  30. $zapytanie = mysql_query("SELECT * FROM ilosc_osob WHERE id<=$liczba");
  31.  
  32. echo 'Iloć osób: <select name="osoby" style="background-color:black; color:white;">';
  33. while($option = mysql_fetch_assoc($zapytanie)) {
  34. echo '<option value="'.$option['id'].'">'.$option['CenaPL'].'</option>';
  35. }
  36. echo '</select>';
  37. ?>
  38.  
  39. </td>
  40. <td>
  41. <center><input type=hidden name=nazwarezerw value="<?php echo $dane['nazwaPL']; ?>"><input type=hidden name=numerrezerw value="<?php echo $dane['numer_terminu']; ?>"><input type=submit value=Rezerwuj<?php if($dane['ilosc_miejsc_wolnych'] == 0): ?> disabled="disabled"<?php endif; ?>></form></center></td>
  42.  
  43. </td>
  44. </tr>
  45. </table>
  46.  
  47. <?
  48. }
  49. ?>


Ten skrypt generuje mi cos takiego:



wyświetla ilość pól w liście rozwijalnej w zależności od ilości wolnych miejsc, jesli miejsc jest zero, przycisk Rezerwuj jest wyłączony
nospor
Cytat
nie wiem czy może tak zostać
Widze ze teraz łączysz po ID. Poraz kolejny więc powtarzam: jeśli logiczne łączenie obu tabel ma się odbywać właśnie przez pola ID to, tak, może tak zostać. Tu naprawdę nie ma żadnej filozofii.

Jeśli to ty robiłeś te tabele, to w ogóle nie wiem po co w ogóle tworzyłeś tabele z ceną. Nie lepiej było poprostu dodać ją jako kolejna kolumna w tabeli terminy?
sorex
Cytat(nospor @ 26.06.2012, 15:38:04 ) *
Jeśli to ty robiłeś te tabele, to w ogóle nie wiem po co w ogóle tworzyłeś tabele z ceną. Nie lepiej było poprostu dodać ją jako kolejna kolumna w tabeli terminy?


Masz rację. Sam sobie zagmatwałem wszystko smile.gif

No ale już działa więc dziękuję bardzo za pomoc.


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.