Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [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
 
Start new topic
Odpowiedzi (1 - 12)
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ć 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 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 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 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 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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 04:37