Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: tworzenie zapytania sql do obsługi dziennika ocen
Forum PHP.pl > Forum > Bazy danych
x X x
Witam - pierwszy raz tutaj na forum, potrzebna jest mi pomoc, której na razie nie uzyskałem na uczelni, dlatego pytanie owo kieruję do Państwa.

Otóż moim zadaniem jest stworzenie projektu, którego rolą będzie przechowywanie i wyświetlanie ocen zaliczeniowych studentów. Sprawa jest na tyle skomplikowana, iż jest to uczelnia, a system docelowo ma działać na wszyskich jej wydziałach. Można się więc domyśleć jak wiele danych jest do przeanalizowania i przekazania w odpowiedni sposób.

Na poniższym zdjęciu prezentuje aktualny schemat najważniejszych tabel z bazy danych:

Schemat tabeli

Moją tabelą jest tabela PASSES, która na tą chwilę wygląda jak wygląda. Być może mógł bym ją przebudować tak, aby zawierała w sobie o wielem niej danych, jednakże na razie wszystko uzależnione jest od tego, czy dane, które chcę wyświelić są w ogóle możliwe do wyświetlenia w sensowny sposób.

Cały system opiera się oczywiście na języku PHP oraz - niestety - AJAXie, który za pomocą biblioteki JQUERY obsługuje wszystkie zapytania, komunikacje z bazą, etc.

Aktualnie priorytetową sprawą dla mnie jest odpowiedź na pytanie:

1. Docelowo chciał bym, aby nauczyciel po zalogowaniu do systemu dostawał listę wszystkich studentów, z którymi prowadzi zajęcia. Czy jest to możliwe, na podstawie widocznych tabel? Nasz system działa na zasadzie tabeli, której każda kolumna może być sortowana na podstawie zawartej w niej rekordów (przykładowo jeżeli kolumna WYDZIAŁ ma rekordy WYDZIAL1, WYDZIAL2, WYDZIAL3, z listy rozwijanej nad tą kolumną mogę wybrać wyświetlanie danych tylko z wybranego wydziału) - dlatego też myślałem, żeby wyświetlać listę studentów i na jej podstawie prowadzący będzie wybierał interesujące go przedmioty do oceny.

2. Jeżeli powyższe jest możliwe - w jaki sposób, do owej listy wszystkich studentów z danego przedmiotu przyczepić tabelę PASSES (pass, pass_date, comments), jeżeli aktualnie owa tabela jest pusta? Próbowałem używać poleceń FULL JOIN, UNION, ale nie przynosiły one odpowiedniego efektu.

3. Jeżeli dwa powyższe są możliwe do wykonania, ostatnia sprawa to zapisanie wszystkich danych do tabeli PASSES. Może pokażę jak wygląda obsługa wyświetlania wybranych danych w systemie:

Wyświetlanie

Jak widać zaznaczyłem nazwę zajęć (w wyświetlaniu jest połączenie z tabel przedmioty, specjalizacja, kierunek i typ studiów), po kliknięciu w dropdowna wyświelta się lista dostępnych przedmiotów. Po kliknięciu OK odpowiednie ID jest wysyłane do tabeli CLASSES, z której pochodzi to zdjęcie. Po kliknięciu PORZUĆ dane nie są zapisywane. Pola mogą być również edytowane tekstowo, gdzie po kliknięciu w nazwę wyświetla się pole tekstowe, które można zedytować i zapisać wpisaną wartość do bazy w odpowiednim miejscu.

Moim zdaniem tabela PASSES na pewno musi mieć jakieś zewnętrzne ID, być może wystarczyło by tylko odniesienie do tabeli CLASSES?

I oczywiście to nie jest tak, że dane w tabeli są wprowazdzone na stałe i nikt ich nie edytuje. Niestety ten system doskonały nie jest i trzeba go co semestr czy co roku aktualizować aby posiadał aktualne dane.

Ja już wykonałem moduł dodawania ocen w formularzu, gdzie wybiera się te wszystkie dane - ale patrząć ze strony wykładowcy, który na pierwszym roku ma dodać oceny 150 studentom przez formularz każdemu z osobna - nie jest to ani wygodne, ani przyjemne rozwiązanie. Chyba że dało by się zrobić formularz, który dodaje wybrane wpisy wszystkim pasującym studentom? Bo już w tym momencie mam taki formularz, rzeczywiście wyświetla mi wszystkich studentów dla wybranych danych w liście rozwijanej.

Proszę o rady :)
ghost1511
Ciężko to stwierdzić po podanym schemacie ponieważ nie widać relacji. Wygeneruj go i wrzuć go tutaj wink.gif
x X x
A jak wyświelić te relacjie w inny sposób niż PHPmyAdminem? Bo mam z nim jakiś problem, i czego bym nie kliknął w widoku tabel to coś się sypie i na nic nie reaguje, nie mogę nawet zmienić zakładki czy przejść na inną bazę... Pracuję na OS X, serwerem jest XAMPP.
nospor
Zasadnicze pytanie, bo nie do konca zrozumialem: czy te tabele co tu pokazales to juz tak mają zostac? Nie mozna juz modyfikowac struktury bazy?

No i opisz po kolei kazdą z tabel, by bylo wiadomo co one zawierają. Nie wszystkie nazwy są dla mnie oczywiste.
Zaś wizualizacją relacji raczej sie nie przyjmuj. Nazwy pol są raczej dosc oczywiste i widac na pierwszy rzut oka gdzie i jakie są relacje
x X x
Sory że dopiero piszę, nie dostałem powiadomienia.

Oczywiście, że można coś zmienić, jednakże jeżeli w tabeli np. CLASSES jest rekordów ponad 5K, podobnie w tabeli STUDENTS - dodawanie wyszczególnionych danych do tych rekordów było by męczarnią, a nie o to w tym chodzi. Poza tym nie ma na to czasu, projekt (tak naprawdę pracę inż) muszę oddać najpóźniej w marcu.

Łapcie widok relacji, zrobiony ręcznie, ale chyba wystarczy :P Wszystkie relacje są relacjami "jeden -> wiele".

Relacje

Wstępna kocepcja jak już pisałem została ustalona i wszystko fajnie działa, tylko właśnie pojawia się problem masowego dodawania rekordów do bazy. Najwygodniejszą opcją było by dodawanie na podstawie tej tabelki, po prostu wpisywanie czy wybieranie oceny dla każdego poszczególnego studenta. Następne w kolejności wygody obsługi jest dodawanie wielu wpisów za pomocą jednego formularza - do pasujących studentów. Z drugiej strony jeżeli studenci mają inne oceny trzeba wtedy wejść w widok tabeli i zmieniać automatycznie dodane w formularzu oceny ręcznie. Ostatecznością jest to, co już jest gotowe (a na co Promotor się nie godzi na razie), czyli dodawanie pojedyncze.

Problem jest taki, że sposób pierwszy, jeżeli możliwy, nigdzie nie jest wykorzystwywany bo nie ma takiej potrzeby. Do tego dochodzą problemy z wyświetleniem owych danych i podczepieniem tabeli PASSES, a później przekazaniem wybranych danych do tabeli PASSES...

Jeżeli coś jeszcze nie jest jasne to proszę pytać, wydaje mi się, że te najważniejsze pola też są jasne do rozszyfrowania.

PS.

Na powyższym zdjęciu widać inną struktrurę tabeli PASSES. Aktualnie jest tak jak na screenie w pierwszym poście.
nospor
Moim zdaniem ta struktura jest ciur ferelna. ALe ze nadal nie wiem do konca co znaczy, wiec trudno mi sie dokladnie wypowiedziec.
No ale chocby takie typy.... Ten kto to tworzyl chyba w zyciu na oczy nie widzial innego typu niz INT11 czy VARCHAR.

Zas co do problemu: to wczym problem? Skoro wiesz jacy studenci sa przypisani do danego przedmiotu danego wykladowcy, to dla danego wykladowcy i danego przedmiotu wyswietlaj liste studentow a obok kazde pole na wpisanie oceny. Potem SAVE i sru do bazy
x X x
W tym problem, że nie mogę sobie z tym poleceniem poradzić ;) Na razie robiłem to na podstawie zapytania SQL, używając komendy UNION, bo FULL JOIN u mnie nie chce działać - z tego co czytałem aby przez UNION połączyć tabele obie muszą mieć tyle samo rekordów.

Miałem taką sytuację, w której w tabeli passes był jeden rekord. Po połączeniu przez union z listą wszystkich studentów pozostałe pola (takie jak przedmiot, wydział, ocena, etc) miały wartości NULL. A chcę, aby takie zapytanie zwróciło mi takie wyniki:

STUDENT || WYDZIAŁ || PRZEDMIOT || PROWADZĄCY || OCENA || DATA || KOMENTARZ
-----------------------------------------------------------------------------------------------------
student1 || wydział1 || przedmiot1 || prowadzący1 || || ||
student2 || wydział1 || przedmiot1 || prowadzący1 || || ||
student3 || wydział1 || przedmiot1 || prowadzący1 || || ||
student56 || wydział1 || przedmiot1 || prowadzący1 || 5 || 15.12.13 || ocena zal.
itd.

Powiedzmy, że jest to widok dla jednego prowadzącego. STUDENT, WYDZIAŁ, PRZEDMIOT, PROWADZĄCY - z 4 różnych tabel, OCENA, DATA, KOMENTARZ z mojej.

Jeżeli coś trzeba wyjaśnić odnośnie struktury - proszę napisz.

EDIT:

zrobiłem takie prowizoryczne zapytanie:

  1. SELECT
  2. classes.class_id,
  3. concat(employees.first_name,' ',employees.last_name) AS pracownik,
  4. units.name AS wydzial,
  5. courses.name AS kierunek,
  6. years.name AS rocznik,
  7. specialties.name AS specjalizacja,
  8. subjects.name AS przedmiot,
  9. concat(students.name,' ',students.sex) AS student
  10. FROM classes
  11. JOIN employees ON classes.employee_id=employees.employee_id
  12. JOIN units ON employees.unit_id=units.unit_id
  13. JOIN years ON classes.year_id=years.year_id
  14. JOIN subjects ON classes.subject_id=subjects.subject_id
  15. JOIN specialties ON subjects.specialty_id=specialties.specialty_id
  16. JOIN courses ON specialties.course_id=courses.course_id
  17. JOIN students ON years.year_id=students.year_id
  18. WHERE classes.year_id=4
  19. AND specialties.course_id=1
  20. AND specialties.specialty_id=1
  21. AND classes.employee_id=5


I teraz powiedzcie mi czy w SQL mogę to złączyć tak, aby z prawej strony dołączyły do tych danych (rekordów jest ponad 400) kolumny passes, pass_date i comments z mojej tabeli PASSES? Jeżeli nie, czy będzie można coś takiego wykonać przy pomocy tej tabeli, której zdjęcie zamieściłem wcześniej? Oraz czy to zapytanie nadaje się do wykorzystania w takiej formie, czy może trzeba zrobić to inaczej (inne joiny, może podzapytania)?

EDYCJA2:

  1. SELECT
  2. classes.class_id,
  3. CONCAT( employees.first_name, ' ', employees.last_name ) AS pracownik,
  4. units.name AS wydzial,
  5. courses.name AS kierunek,
  6. years.name AS rocznik,
  7. specialties.name AS specjalizacja,
  8. subjects.name AS przedmiot,
  9. CONCAT( students.name, ' ', students.sex ) AS student,
  10. passes.pass
  11. FROM classes
  12. JOIN employees ON classes.employee_id = employees.employee_id
  13. JOIN units ON employees.unit_id = units.unit_id
  14. JOIN years ON classes.year_id = years.year_id
  15. JOIN subjects ON classes.subject_id = subjects.subject_id
  16. JOIN specialties ON subjects.specialty_id = specialties.specialty_id
  17. JOIN courses ON specialties.course_id = courses.course_id
  18. JOIN students ON years.year_id = students.year_id
  19. LEFT JOIN passes ON classes.subject_id = passes.subject_id
  20. WHERE classes.year_id =4
  21. AND specialties.course_id =1
  22. AND specialties.specialty_id =1
  23. AND classes.employee_id =5


Powyższe polecenie dokleja kolumnę passes do wyświetlonych wcześniej danych. Jeżeli w tabeli nie ma studenta, który z owego przedmiotu na danym kierunku/roku/specjalizacji, u danego nauczyciela ma wpisaną ocenę - w kolumnie wyświetlają się wartości NULL. Natomiast, jeżeli jest przynajmniej jedna osoba spełniająca powyższe warunki, wtedy rzeczywiście ocena się wyświetla, ale przy każdym rekordzie z zapytania. RIGHT JOIN tutaj nie działa, tak samo polecenia OUTER, czy FULL.

Hmm nikt nie pomoże? Chyba nie dałem zadania niemożliwego do rozwiązania? :D

UPDATE 23.02.2014:

Jak już pisałem wcześniej w temacie, który niestety został zamknięty rezygnuję z takiego sposóbu wykonania aplikacji. Jak dla mnie jest to niewykonalne aktualnie - i nie wiem, czy w ogóle da się to tak zrobić. Za dużo problemów, między innymi z dodawaniem tych wszystkich danych, później ich wyświetlaniem. Po co.

Dlatego wydaje mi się, że owy problem pozostawiam nie rozwiązany i przechodzę do innego koncepcji.

MIANOWICIE chcę wykonać formularz, który po przyciśnięciu przycisku zapisz doda wielokrotnie wybrane i zedytowane dane do tabeli oceny, zmieniając tylko identyfikator studenta, aby jednym zapytaniem dodać wiele rekordów wszystkim pasującym studentom. Może pokażę, jak teraz wygląda mój formularz:

https://www.dropbox.com/s/z80xqwit1m32ngp/Z...%2014.31.56.png

Po wybraniu odpowiednich danych zmienia się lista dostępnych studentów. Nie działa to jeszcze do końca właściwie, ale z tym myślę sobie poradzić.

Aktualnie owy formularz dodaje do mojej tabeli oceny wszystkie wybrane i wpisane dane. Chcę, tak jak na wstępie, aby za jego pomocą wybrane dane zostały zapisywane dla wszystkich dostępnych i pasujących studentów (czyli zmienia się tylko identyfikator studenta).

Czy można coś takiego wykonać? Dodam, że funkcja odpowiedzialna za dodawanie danych jest napisana w javie. Jeżeli zajdzie potrzeba mogę ją tutaj udostępnić.

Bardzo proszę o pomoc. To pilna sprawa...

UPDATE 26.02.2014

Naprawdę myślałem, że gdy napiszę na największym w Polsce forum poświęconym tematyce PHP to znajdzie się wielu, którzy bedą w stanie mi pomóc, może nie w całości od razu, ale przynajmniej w jakichś częściach.

I teraz nie wiem czy nikomu się po prostu nie chcę poruszyć tematu, czy temat jest na tyle trudny, że nie da się z tym nic zrobić? Czasu mam mało, a skoro nie potrafią doradzić mi profesjonaliści (których na pewno tutaj znajdę) to wątpie, abym sam na poziomie akademickim sobie z nim poradził.

Bardzo dziwna sprawa, zważywszy na to, że już ponad 1000 wyświetleń tego tematu...

Jeżeli coś jest niejasne proszę napisać, śmiało wyjaśnię owe kwestie.

BTW wpadł mi do głowy wczoraj pomysł na sposób wybierania studentów, którym należy dodać ocenę. Tylko również nie wiem, czy będzie to wykonalne + czy będzie skuteczne. Aktualnie pasujący studenci wyświetlają się na liście rozwijanej. Ja pomyślałem o wyświetlaniu ich na dynamicznej checkliście, po czym formularz dodaje wielokrotne dane dla wybranych w tej liście studentów. Co o tym myślicie? Jednakowoż nadal moim priorytetowym sposobem rozwiązania problemu jest dodawanie ocen wszystkim pasującym studentom, tak, jak to opisałem wcześniej.
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.