Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]jak napisac zapytanie łaczące trzy tabele
Forum PHP.pl > Forum > Przedszkole
modic
mam baze danych o takiej strukturze:

  1. TABLE `oceny` (
  2. `id_oceny` int(11) NOT NULL AUTO_INCREMENT,
  3. `id_przedmiot` int(11) NOT NULL DEFAULT '0',
  4. `id_uczen` int(11) NOT NULL DEFAULT '0',
  5. `ocena` int(11) NOT NULL DEFAULT '0',
  6.  
  7. TABLE `przedmioty` (
  8. `id_przedmiotu` int(11) NOT NULL AUTO_INCREMENT,
  9. `przedmiot` varchar(25) DEFAULT NULL,
  10.  
  11. TABLE `uczniowie` (
  12. `id_ucznia` int(11) NOT NULL AUTO_INCREMENT,
  13. `imie` varchar(255) NOT NULL DEFAULT '',
  14. `nazwisko` varchar(255) NOT NULL DEFAULT '',
  15. `uczen_idrodzica` int(11) DEFAULT NULL,
  16. `uczen_idklasy` int(11) NOT NULL DEFAULT '0',



na napisałem coś takiego:

  1. <?php
  2. // funkcja wyswietlanaca oceny
  3. function ocena ($id_ucznia, $przedmiot) {
  4. // zxapytanie o oceny z przedmiotu
  5.  
  6. $zapytanie_oceny = mysql_query("SELECT ocena FROM oceny WHERE id_przedmiot='$przedmiot' AND id_uczen='$id_ucznia'");
  7. if (!$zapytanie_oceny) {
  8. exit  ('<br><p>Problem podczas pobierania ocen ucznia z bazy danych !!!<br/>'.
  9.   'Error: '.mysql_error().'</p>');
  10. }
  11.  
  12. echo " - ";
  13.  
  14. if(!mysql_num_rows($zapytanie_oceny)){
  15. $napis = "brak ocen";
  16. }
  17.  
  18. echo $napis;
  19.  
  20. while ($wynik = mysql_fetch_array($zapytanie_oceny)) {
  21. $ocena = $wynik['ocena'];
  22.  
  23. echo "<span class='error'>";
  24. echo  "$ocena ";
  25.  
  26. echo "</span>";
  27.      
  28. }
  29. echo "</p>";
  30. }
  31.  
  32.  
  33. // zapytanie o przedmioty i wyświetleenia listy ocen
  34. if(!empty($_POST['przedmiot_id'])){
  35.  
  36. $liczba = 1;
  37.  
  38. $zapytanie = mysql_query("
  39. SELECT
  40.  id_ucznia,
  41.  imie,
  42.  nazwisko,
  43.  uczen_idrodzica
  44. FROM
  45.  uczniowie
  46. where
  47.  uczen_idklasy=$id_class
  48. order by
  49.  uczniowie.nazwisko");
  50. if (!$zapytanie) {
  51. exit  ('<br><p>Problem podczas pobierania danych uczniów z bazy danych !!!<br/>'.
  52.   'Error: '.mysql_error().'</p>');
  53. }
  54. echo "<br>";
  55.  
  56. if(!mysql_num_rows($zapytanie)){
  57. echo "<div align='center'><span class='error'>brak wyników do wyswietlenia</span></div>";
  58. }
  59.  
  60. while ($wynik = mysql_fetch_array($zapytanie)) {
  61. $id = $wynik['id_ucznia'];
  62. $imie = htmlspecialchars($wynik['imie']);
  63. $nazwisko = htmlspecialchars($wynik['nazwisko']);
  64. $id_rodzic = $wynik['uczen_idrodzica'];
  65.  
  66. echo  "<p>$liczba. <b>$nazwisko $imie</b>";
  67. $liczba ++;
  68.  
  69.  ocena ($id, $_POST['przedmiot_id']);
  70.  
  71. echo "</li>";
  72. }
  73. }
  74. ?>



w tym moim kodzie jest funkcje OCENA (mająca własne zapytanie do bazy), która jest wywoływana tyle razy ilu jest uczniów w klasie, i sluży do wyświetlenia ocen uczna z danego przedmiotu

A moje pytanie brzmi, czy nie da się jakoś napisać tego w taki sposób, aby wszystko zmieścić w jednej funkcji i napisać tylko jedno zapytanie do bazy danych, tak by wyświetliła taki wynik:

OCENY Z MATEMATYKI:
Nazwisko1 Imię1 - 1, 5, 3, 4
Nazwisko2 Imię2 - 5, 1, 4, 4

z góry dziękuje za wszelką pomoc
Lion_87
moglbys LEFT JOIN ale musialbys miec cos co łaczy 3 tabele (jakas kolumno co znajduje sie w kazdej z tych 3 tabel)

a tu masz podobny temat
http://forum.php.pl/index.php?showtopic=68162
melkorm
jakbyś podał zrzuty tabeli z przykładowymi danymi było by miło bo bym miał na czym testować a aż taki ambitny by samemu sobei wszystko wrzucać nie jestem .... no i strzelac zapytaniami także nie mam ochoty ;]

Więc prosze o zrzut tabeli z przykładowymi danymi przypuśćmy po 5 rekordów z każdej ale żeby także się nakładały - dzieki.
Ociu
Jesteś od niedawna na forum, dlatego informuję Cię, że posiadamy takie coś jak tagi, które są wymagane na tym subforum oraz bbCode. Poprawiam, ale ostatni raz, następny temat niezgodny z regulaminem zostanie zamknięty.
modic
http://zsgozd.avx.pl/inne/tabela.sql

tu jest zrzut całej bazy, co do LEFT JOIN to próbowałem, ale coś mi nie szło, zresztą problem jest taki że ma się wyświetlać cała lista uczniów i oceny, a ocen jest więcej niż jedna i z tym miałem największy problem

i przepraszam za brak tagów
melkorm
  1. SELECT p.przedmiot , u.imie , u.nazwisko, GROUP_CONCAT(ocena) AS oceny FROM oceny o LEFT JOIN przedmioty p ON (o.id_przedmiot = p.id_przedmiotu) LEFT JOIN uczniowie u ON (o.id_uczen = u.id_ucznia) GROUP BY u.id_ucznia;


i zmień oceny z int na varchar

  1. ALTER TABLE `oceny` CHANGE `ocena` `ocena` VARCHAR( 11 ) DEFAULT '0'


*edit* Poprawienie wyglądu wyników:

  1. SELECT p.przedmiot , u.imie , u.nazwisko, GROUP_CONCAT(ocena ORDER BY ocena) AS oceny FROM oceny o LEFT JOIN przedmioty p ON (o.id_przedmiot = p.id_przedmiotu) LEFT JOIN uczniowie u ON (o.id_uczen = u.id_ucznia) GROUP BY u.id_ucznia ORDER BY p.przedmiot ;
modic
dzięki za pomoc, nauczyłem się jak łączyć tabelki, ale natrafiłem na kolejny problem

napisałem coś takiego:

CODE
$id_przedmiot = $_POST['przedmiot_id'];
$id_klasa = 15;

$zapytanie = mysql_query("
SELECT nazwisko, imie, ocena, id_przedmiot, id_ucznia, uczen_idklasy
FROM uczniowie LEFT JOIN oceny ON (id_ucznia=id_uczen)
WHERE id_przedmiot=$id_przedmiot
AND uczen_idklasy=$id_klasa
GROUP BY id_ucznia
ORDER BY nazwisko
");


ale niestety nie zwraca mi wszystkich ocen, a jedynie pierwszą, zamiast
" Pierwszy Uczeń - 3 2 4 5 5 1 "

mam tylko
"Pierwszy Uczeń - 3 "

no i nie wyświetla mi uczniów, którzy nie posiadają ocen, ale to narazie mnie nie martwi.

Może jakaś rada, jak temu zaradzić questionmark.gif
melkorm
Cytat
ale niestety nie zwraca mi wszystkich ocen, a jedynie pierwszą, zamiast
" Pierwszy Uczeń - 3 2 4 5 5 1 "


od tego było GROUP_CONCAT() w moim zapytaniu ;]
modic
użyłem GROUP_CONCAT ale teraz w ogóle nie wyświetla mi ocen na stronie

kod do wyświetlenia wyników zapytania wygląda tak, ale pokazuje mi tylko nazwisko i imię, bez oceny

CODE
while ($wynik = mysql_fetch_array($zapytanie)) {
$id = $wynik['id_ucznia'];
$imie = htmlspecialchars($wynik['imie']);
$nazwisko = htmlspecialchars($wynik['nazwisko']);
$id_rodzic = $wynik['uczen_idrodzica'];
$ocena = $wynik['ocena'];

echo "$liczba. $nazwisko $imie - $ocena";
}


czy do wyświetlenie zawartości ocen nie trzeba dopisać czegoś jeszcze questionmark.gif
melkorm
no kolego ale pokaż zapytanie ....

  1. SELECT nazwisko, imie, GROUP_CONCAT(ocena) AS ocena, id_przedmiot, id_ucznia, uczen_idklasy
  2. FROM uczniowie LEFT JOIN oceny ON (id_ucznia=id_uczen)
  3. WHERE id_przedmiot=$id_przedmiot AND uczen_idklasy=$id_klasa
  4. GROUP BY id_ucznia
  5. ORDER BY nazwisko


ostatnio Twoje zmienione.
Co do uczniów bez ocen - przyczyna brak spełnienai warunku czyli brak id_przedmiotu ;]
modic
wszystko działa tak jak należy, jedynie nie wyświetla mi uczniów, którzy nie mają ocen z danego przedmiotu, ale jakoś dojdę jak to zrobić

melkorm, jakbyśmy się kiedyś spotkali to przypomnij mi, że ci flaszkę wisze smile.gif
zebupl
Witam,

Przeglądając posta i Twój schemat bazy danych widzę, że zaczynasz dopiero stawiać pierwsze kroki. Warto, żebyś trzymał się kilku rzeczy:

1. Staraj się nazywać atrybuty analogicznie jak tabelę. Raz masz imię drugim razem masz imie_rodzica. W sumie jak nie znam bazy to nie wiem czego dotyczy imie w tabeli uczniowie. Lepiej jakbyś miał: uczniowie (uczen_id, uczen_imie, uczen_nazwa). Jak masz np oceny to: (oceny_id, ocena_przedmiot_id, ocena_uczen_id). Dzkięki temu każdy atrybut sam się opisuje. Teraz możesz nie mieć problemu ale jak przyjdzie już kilkanaście tabel to zaczną się problemy
2. Używaj nazw angielskich
3. Używaj prefix-y przed nazwami relacji ułatwi to instalację schematu w bazie, która ma już tabele
4. Widzę, że używasz w nazwach liczby mnogiej i pojedyńczej w nazwach atrybutów to łanie winksmiley.jpg

pozdrawiam
munky
modic
masz rację, dopiero zaczynam nie jeszce nie wyrobiłem sobie "dobrych" nawyków, ale powoli się rozwijam smile.gif
dzięki za dobre rady, juz zaczołem je wykożystywać, bardzo sie przydaję
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.