![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 13 Dołączył: 29.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Witam. Chcę się zapytać jak mogę rozwiązać problem zapisu id uczniów nieobecnych na zajęciach, do tabeli MySQL. Zarys tabeli przedstawia się tak:
CODE id_listy | id_przedmiot | id_nieobecne | id_klasa | id_szkola | data_listy Przedstawiona tabela jest tabelą dzienniczka elektronicznego. Mój problem polega na tym że nie wiem czy powinienem zapisywać wszystkie id nieobecnych uczniów do pola o nazwie "id_nieobecne" a następnie rozdzielać to w PHP pętlą. Chodzi mi o coś takiego: CODE id_listy | id_przedmiot | id_nieobecne | id_klasa | id_szkola | data_listy 1 | 3 | 1426 | 6 | 8 | 2017-22-03 gdzie 1426 to osobne id uczniów Baza dzienniczka elektronicznego będzie bazą dla wielu szkół dlatego chcę tworzyć listy obecności w jednej tabeli i później wybierać obecności po id przedmiotu, id klasy oraz id szkoły. Moim zdaniem takie rozwiązanie jest dobre do momentu aż przyjdzie mi rozdzielać te obecności na każdego z uczniów w danej szkole. Będę wdzięczny za każdą pomoc. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
A 1426 to id=1426, czy może 14 i 26, a może 1, 4, 2 i 6, a może 142 i 6...?
Odpowiedź mam nadzieję, że sam znajdziesz. Aby tylko to nie było dodawanie przecinków pomiędzy id. Czy id_szkola i id_klasa są potrzebne jednocześnie w tabeli? Skoro masz id_klasa, to wiesz do jakiej szkoły przynależy. Datę listy w tym ujęciu zmieniłbym raczej na datę nieobecności. Ten post edytował trueblue 30.09.2017, 21:38:32 -------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 13 Dołączył: 29.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Rozumiem o co Tobie chodzi. Masz rację że później będzie problem z odróżnieniem czy id nieobecności składa się z jednej czy dwóch cyfr. Zastanawiałem się też żeby rozdzielić te id jakimś separatorem ale skoro ma przechowywać id to pole powinno przechwywać wartości int a nie varchar. Chyba pozostanie mi tylko stworzyć tabelę łącznikową tylko nie wiem jak mogłaby wyglądać. Odnośnie pola id szkola to faktycznie jest zbędne. Jutro będę nad tym myślał
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Co do nieobecności to poszedłbym o krok dalej i zostawił tylo:
ID_ucznia data_nieobecności ID_przedmiotu Tylko te 3 kolumny. Zapewniają one minimalne wymagania aby pobrać odpowiednie dane. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 13 Dołączył: 29.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Niestety Id_Klasa musi zostać gdyż dane listy obecności dla nauczyciela będą później pobierane przy użyciu sesji z id klasy a id przedmiotu będzie pobierane za pomocą metody GET z pola typu select. Załóżmy że jeden nauczyciel uczy kilka klas z tego samego przedmiotu i jeżeli zostanie pobrane id przedmiotu(który jest kategorią) to zostaną wyświetlone wszystkie listy obecności z przedmiotu np. matematyka, niezależnie od klasy i nauczyciel nie będzie wiedział do której klasy przypisana jest dana lista obecności. Żeby doprecyzować filtrowanie dorzucam do tego zmienną sesyjną z Id_Klasa która wyświetla tylko i wyłącznie listę wybranej klasy z przedmiotu matematyka. Chcę utworzyć sesję klasy ze względu na to że nauczyciel będzie się poruszał pomiędzy zakładkami(tzn. będzie mógł dodawać, usuwać ucznia o ile jest wychowawcą itd nie wybierając za każdym razem klasy w której uczeń jest zapisany). stworzyłem coś takiego:
Lista tabel Najpierw będzie pobierana lista wszystkich klas których uczy nauczyciel. Następnie zostanie utworzona zmienna sesyjna z id danej klasy natomiast później nauczyciel będzie wybierał istniejącą już listę obecności bądź tworzył nową listę dla klasy ze zmiennej sesyjnej i przedmiotu o id ze zmiennej GET. Taka struktura powinna ułatwić mi później pobieranie nieobecności dla danego ucznia. Co wy na to? Jeżeli będzie trzeba to podrzucę screeny widoków przyszłej strony które zobrazują o co mi chodzi Ten post edytował emillo91 1.10.2017, 12:50:44 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Uczeń należy do jednej klasy, więc jeśli masz id ucznia, to wiesz jakie jest id klasy.
-------------------- |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
@trueblue tak też załżyłem, ale czytając to co autor napisał to chyba nie koniecznie.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Pyton_000,
ja się opieram na tym stwierdzeniu autora "nauczyciel nie będzie wiedział do której klasy przypisana jest dana lista obecności.". Skoro mam id_ucznia w liście obecności, to wiem jaka to klasa. Ale być może czegoś nie rozumiem, bo przyznam, że opis dla mnie jest chaotyczny. -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Chociaż trzeba by było wziąć pod uwagę że uczeń należał do klasy 1-4 a teraz jest w 5
![]() |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Można rozdzielić osobę i ucznia na wyższym poziomie.
Czyli tablica z osobami gdzie będą stałe dane dotyczące osoby (imię, nazwisko, data urodzenia) i potem uczniami (numer w dzienniku, id klasy). Na taki sam problem trafiłem dawno gdy robiłem bazę pod zawodników, błędnie zacząłem używać user_id i dopiero potem rozdzieliłem to na zawodnika i usera. -------------------- |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 13 Dołączył: 29.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Mi chodzi o sytuację kiedy na konto jest zalogowany nauczyciel. Jak skrypt ma pobrać poprzednie listy obecności danej klasy nie wiedząc którzy uczniowie są przydzieleni do danej klasy?. Odnośnie screenów to chodzi mi o coś takiego:
Na początku nauczyciel wybiera klasę powiedzmy 2Lp (czyli musi ustawić id klasy do zmiennej sesyjnej): link1 Następnie przechodzi do zakładki "Listy obecności" i tam, po wybraniu przedmiotu matematyka(nauczyciel może uczyć też innych przedmiotów) wyświetla się zbiór list obecności dla klasy 2Lp: link2 Następnie może utworzyć nową listę obecności dla tej klasy z przedmiotu matematyka bądź wyświetlić już istniejącą listę: link3 To co piszecie odbieram tak że nauczyciel(nie wychowawca) musiałby wyświetlać zbiór list obecności poprzez sprawdzenie id ucznia a następnie wybranie id klasy. Nie za bardzo rozumiem o co chodzi. |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Nie.
Nie ważne kim jesteś. Jeśli wybierasz klasę to masz `id_klasy`. A skoro już wiesz jaką klasę masz to możesz na tej podstawie pobrać listę uczniów. Skoro masz listę uczniów to wybierając datę listy i przedmiot masz gotowe dane Taki przykład nieobecnosci na podstawie klasy: Kod SELECT nieobecnosci.* FROM klasa JOIN uczniowie_klasa ON(uczniowie_klasa.klasa_id = klasa.id) JOIN uczniowie ON(uczniowie.id = uczniowie_klasa.uczen_id) LEFT JOIN nieobecnosci ON(nieobecnosci.uczen_id = uczen.id) WHERE id_klasy = 5; |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 13 Dołączył: 29.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Już rozumiem. Chodzi o to żeby pobierać dane o klasie z rekordu zarejestrowanego ucznia. Ja miałem inny zamysł. Chciałem przypisywać ucznia do klasy a nie klasę do ucznia ale nie wiem czy może być jakaś różnica(w sensie działania) między tymi rozwiązaniami(czy będzie więcej joinów dla mojego rozwiązania). Pyton_000 na podstawie Twojego zapytania zrobiłem takie tabele:
link I teraz mogę sprawdzać warunkiem czy id wybranego ucznia znajduje się w nieobecnościach. Tylko będę miał jeszcze jeden problem który po tym nastąpi. Jak zliczyć ilość lekcji które się odbyły żeby dla każdej lekcji skrypt sprawdzał czy uczeń był na zajęciach czy nie(np. 7 lekcji to 7 iteracji dla jednego ucznia)? Chciałem to rozwiązać pobierając wszystkie zapisane listy obecności z tabeli "ListyObecnosci" i wtedy wiedziałbym ile lekcji(na podstawie list obecności) się już odbyło. |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Punktem wyjścia i sercem modelu powinna być tabela "zajęcia", która zawiera coś w rodzaju:
- datę zajęć - kto prowadzi (imię/nazwisko) - relację do listy uczestników/uczniów (oddzielna tabela z jakiś polem typu boolean isPresent i oczywiście imię/nazwisko ucznia) - dane klasy (np. nazwa XIII B ) - dane przedmiotu (np. pauperyzacja w społeczeństwie) Do tego panel administracyjny gdzie definiujemy wszystko co niezbędne do zapełnienia tabeli "zajęcia" - tabelę użytkowników - tabelę klas - tabelę przedmiotów - tabelę uczniów (id użytkownika + id klasy) - tabelę nauczycieli - itd. Trzeba pamiętać o historycznym aspekcie danych. Można np. zastąpić imię/nazwisko user_id jeśli założymy, że tabela users jest immutable i np. wyrzucenie ucznia ze szkoły nie będzie skutkowało jego usunięciem z tej tabeli. Inaczej ktoś chciałby zobaczyć zajęcia id=1 sprzed roku i mógłby się zdziwić, że np. belfer jest inny ![]() Ten post edytował Pilsener 5.10.2017, 11:22:45 |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 129 Pomógł: 13 Dołączył: 29.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Odnośnie archiwizacji danych to niektóre rekordy musiałyby być duplikowane w pewnych przypadkach. Jeżeli uczeń zmieniałby klasę to musiałby otrzymywać nowe id a stare zostałoby dla innych tabel ale to wiąże się z redundancją rekordów(bo dane ucznia ze starego rekordu tez muszą zostać zapisane). Ewentualnie można utworzyć tabelę "zmiany_danych" w której uwzględni się stare id ucznia a id dodanego rekordu przypisze się do pozostałych tabel. Jeżeli chodzi o temat listy obecności uczniów to uznam go za rozwiązany. Podany przeze mnie powyżej wzór tabeli spełnia moje wymagania. Jeżeli chodzi o temat archiwizacji to będę kombinował a jeżeli nie będę czegoś wiedział to poproszę o pomoc.
Edit: Odnośnie archiwizacji danych to natknąłem się na takie coś jak tiggery(wyzwalacze) ![]() Ten post edytował emillo91 8.10.2017, 17:44:56 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 20.07.2025 - 01:59 |