Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Tabele i relacje między tabelami
Forum PHP.pl > Forum > Przedszkole
JanMatuszak
Dzień dobry!

Mamy taką bazę:
Tabela users (....)
Tabela Skrzynki ( id_skrzynki, nazwa_skrzynki)
Tabela Narzędzia (id_narzędzia, id_skrzynki, nazwa, zdjęcie

Założenia do skrzynki przypisano narzędzie.
Po uruchomieniu formularza, użytkownik potwierdza lub nie potwierdza obecność narzędzia w skrzynce. Brak narzędzia powinien skutkować zapisaniem, że pracownik 1 oddał kompletną skrzynkę, a pracownik 2 zdekompletował skrzynkę. Gdzie taką informację uzupełnić? Nie mówimy o kompletności skrzynki, lecz o chwili zaginięcia elementu walizki. Czekam na wasze sugestie... Może mieliście podobny problem.
sadistic_son
Sorry ale tak to opisałeś że nie do końca rozumiem Twój problem. Nie tylko ja najwidoczniej, skoro przez 23h nikt Ci nie odpisał. Spróbuj może to opisać innymi słowami.
ohm
No ja miałem właśnie wczoraj odpisywać ale nie byłem pewny czy na pewno to będzie odpowiedź na pytanie biggrin.gif

Więc wg tego co rozumiem to potrzebujesz tabeli pośredniej/łączącej typu
id_uzytkownika, id_skrzynki, id_narzedzia, data_potwierdzenia, czy_obecne
i zapisujesz sobie wszystkie informacje, po czym masz możliwość sprawdzenia kiedy kto i jak. Oczywiście można te tabele skrócić wywalając id_skrzynki, lub całkowicie zmienić architekturę czyli zrobić potwierdzanie dla kompletności skrzynki a dopiero w przypadku braku tworzyć rekord w tabeli braki_narzedziowe ze strukturą np id_uzytkownika, id_narzedzia, data_potwierdzenia, itp.

Ogólnie bez sprecyzowania wymagań można to zrobić na kilka różnych sposobów.
JanMatuszak
Cytat(sadistic_son @ 25.02.2023, 17:36:59 ) *
Sorry ale tak to opisałeś że nie do końca rozumiem Twój problem.



Cytat(ohm @ 25.02.2023, 18:07:57 ) *
No ja miałem właśnie wczoraj odpisywać ale nie byłem pewny czy na pewno to będzie odpowiedź na pytanie biggrin.gif



No dobrze to zacznijmy jeszcze raz, tym razem spokojniej, bez większej frustracji...

Baza zawiera 4 tabele
1. tabela users - nie bierze udziału w tym zapytaniu
2. Tabela walizki - przechowuje informacje o numerze wewnętrznym, typie walizki itp.
3. Tabela narzędzia - przechowuje informacje katalogowe o narzędziach. np. id skrzynki w której się znajduje, linku do zdjęcia,
4. Tabela przeliczenia zawiera informacje o stanie (jest/brak/niekompletne) znaczniku czasu datetime, nazwisku przeliczającego

I teraz magia...

1. Chciałbym móc wydobyć listę stanu narzędzi walizki 1 wraz z jej stanem na moment ostatniego datetime
Przykład:
Wiertarka, jest, 2023-02-25, 19:30, Duda
Szlifierka, brak, 2023....., Duda

Oczywiście wśród historii znajdziemy wpisy które będą miały wcześniejszą datę, ale te wiersze pomijamy.
np.
Wiertarka, jest, 2023-01-25, 11:11, Kaczka
Szlifierka, brak, 2023....., Kaczka



ohm
Cytat(JanMatuszak @ 25.02.2023, 21:52:07 ) *
1. Chciałbym móc wydobyć listę stanu narzędzi walizki 1 wraz z jej stanem na moment ostatniego datetime
Przykład:
Wiertarka, jest, 2023-02-25, 19:30, Duda
Szlifierka, brak, 2023....., Duda

Oczywiście wśród historii znajdziemy wpisy które będą miały wcześniejszą datę, ale te wiersze pomijamy.
np.
Wiertarka, jest, 2023-01-25, 11:11, Kaczka
Szlifierka, brak, 2023....., Kaczka



  1. SELECT (...) FROM przeliczenia p JOIN narzedzia n (...) WHERE p.przeliczenie_narzedzie_id = X ORDER BY p.przeliczenie_dataAktualizacja DESC LIMIT 1


Coś na takiej zasadzie, jakbys chciał cała liste narzedzi z ostatnim stanem to już musisz troche pokombinowac z grupowaniem przeliczenie_narzedzie_id i wyciaganiem ostatniego rekordu.
https://stackoverflow.com/questions/1313120...ach-group-mysql
JanMatuszak
Twoje przemyślenia pozwalają na odczyt ostatniego aktualizowanego rekordu.

Napisałem coś takiego - jednak też nie działa jak trzeba:
  1. SELECT narzedzia.narzedzie_nazwa, przeliczenie_stan, przeliczenie_dataAktualizacji,przeliczenie_kontrolujacy FROM `przeliczenia`LEFT JOIN narzedzia ON przeliczenie_narzedzie_id = narzedzia.narzedzie_id GROUP BY przeliczenia.przeliczenie_narzedzie_id ORDER BY max(przeliczenia.przeliczenie_dataAktualizacji) DESC;


narzedzie_nazwa przeliczenie_stan przeliczenie_dataAktualizacji przeliczenie_kontrolujacy
Szlifierka kątowa x 24.02.2023 20:42 JM
Wiertarka n 24.02.2023 20:42 JM
Wkrętarka t 24.02.2021 20:41 JM



a tabela przeliczenia ma takie dane.

przeliczenie_id przeliczenie_narzedzie_id przeliczenie_dataAktualizacji przeliczenie_kontrolujacy przeliczenie_stan
1 1 24.02.2021 20:41 JM t
2 2 24.02.2023 20:42 JM n
3 3 24.02.2023 20:42 JM x
4 3 24.02.2021 20:44 JM 0
5 3 24.02.2025 20:42 JM x


A ostatni wynik się nie wyświetla.
ohm
  1. ORDER BY max(przeliczenia.przeliczenie_dataAktualizacji) DESC


Pytanie z ciekawosci, co ten zapis ma na celu? smile.gif
JanMatuszak
Cytat(ohm @ 26.02.2023, 19:13:37 ) *
  1. ORDER BY max(przeliczenia.przeliczenie_dataAktualizacji) DESC


Pytanie z ciekawosci, co ten zapis ma na celu? smile.gif


Zagalopowałem się, nie to miałem na myśli, ale bez max też jest ten sam problem smile.gif
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.