Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]jak napisac zapytanie łaczące trzy tabele
modic
post
Post #1





Grupa: Zarejestrowani
Postów: 64
Pomógł: 0
Dołączył: 18.07.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Lion_87
post
Post #2





Grupa: Zarejestrowani
Postów: 850
Pomógł: 120
Dołączył: 15.02.2007
Skąd: Łódź

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
melkorm
post
Post #3





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Ociu
post
Post #4





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




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.
Go to the top of the page
+Quote Post
modic
post
Post #5





Grupa: Zarejestrowani
Postów: 64
Pomógł: 0
Dołączył: 18.07.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
melkorm
post
Post #6





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


  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 ;


Ten post edytował melkorm 5.10.2008, 16:20:45
Go to the top of the page
+Quote Post
modic
post
Post #7





Grupa: Zarejestrowani
Postów: 64
Pomógł: 0
Dołączył: 18.07.2008

Ostrzeżenie: (0%)
-----


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ć (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Ten post edytował modic 5.10.2008, 21:49:56
Go to the top of the page
+Quote Post
melkorm
post
Post #8





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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 ;]
Go to the top of the page
+Quote Post
modic
post
Post #9





Grupa: Zarejestrowani
Postów: 64
Pomógł: 0
Dołączył: 18.07.2008

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
melkorm
post
Post #10





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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 ;]

Ten post edytował melkorm 6.10.2008, 00:46:59
Go to the top of the page
+Quote Post
modic
post
Post #11





Grupa: Zarejestrowani
Postów: 64
Pomógł: 0
Dołączył: 18.07.2008

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
zebupl
post
Post #12





Grupa: Zarejestrowani
Postów: 26
Pomógł: 2
Dołączył: 7.10.2008

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

pozdrawiam
munky
Go to the top of the page
+Quote Post
modic
post
Post #13





Grupa: Zarejestrowani
Postów: 64
Pomógł: 0
Dołączył: 18.07.2008

Ostrzeżenie: (0%)
-----


masz rację, dopiero zaczynam nie jeszce nie wyrobiłem sobie "dobrych" nawyków, ale powoli się rozwijam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
dzięki za dobre rady, juz zaczołem je wykożystywać, bardzo sie przydaję
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 17.09.2025 - 17:01