![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
Mam dwie tabele stworzone według zapytań jak niżej.
W "events" zapisuję pewne zdarzenia powtarzalne w czasie wykonywane przez osoby z tabelki "persons". Każde zdarzenie ma jak widać dwa stany. Moje pytanie jest nastepujące: Jak wydostać sName wszystkich osób, których ostatnim wykonanym zdarzeniem jest 'In'? Próbowąłem pokombinowąć trochę, ale jedyne co mi wysżło to:
-------------------- |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 140 Pomógł: 16 Dołączył: 12.06.2002 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Ciężko wywnioskować z tego opisu czy mogą istnieć dwa zdarzenia tego samego typu w takich samych stanach wykonywane przez tego samego użytkownika. Jeżeli nie to zapytanie jest ok.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
Jako "zdarzenia" przyjmijmy wchodzenie / wychodzenie pracownika z firmy.
"events" w tym przypadku to kolejne przejścia przez drzwi. "In" / "Out" - pracownik po roku przejdzie przez drzwi tysiące razy - ja muszę z tych tabelek wyciągnąć tych, którzy weszli ale JESZCZE nie wyszli. -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 255 Pomógł: 0 Dołączył: 22.04.2004 Skąd: Żoliborz Ostrzeżenie: (0%) ![]() ![]() |
1.jeżeli jeden persons może mieć wiele events to dlaczego nie ma poł±czenia relacyjnego(w tabeli events pole id_persont(int)) tylko przez pola varchar?
2.jak z takiego varchar wyciagn±c max() (ostatnie zdarzenie)? jeżeli przyjmiemy że przerobisz tabele i bedziesz miał mysql'a >4.1.x to:
Ten post edytował popbart 20.12.2004, 17:38:22 -------------------- Visual Basic - kto by pomyślał :)
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 140 Pomógł: 16 Dołączył: 12.06.2002 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Rozważmy taki sposób:
Przy pewnym uproszczeniu, że pracownik nie wychodzi następnego dnia (czyli nie pracuje na 3 zmianę) można by porównywać znaczniki czasu zdarzeń IN / OUT w danym dniu. Czyli bierzemy MAX(iTimestamp) z IN i porównujemy z MAX(iTimestamp) z OUT dla danego użytkownika. Jeśli 1>2 to znaczy, że nie wyszedł. Co o tym sądzisz? |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
Może coś prościej...
Jak wyciągnąć ostatnią sAction dla każdego zapisanego sCode ? Kurde.. pomroczość jasna u mnie nie ustepuje... -------------------- |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
To nie pomroczność, tylko zadanie bardzo trudne do zrealizaowania bez podzapytań.
http://dev.mysql.com/doc/mysql/en/example-...-group-row.html -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
Koniec końców pomogłem sobie takim kodem:
Jakby kto pytał, to $db to obiekt klasy ezSQL - klasy której uzywam jako DAO -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
A ja mimo wszystko byłem przekonany, że można to zrobić przy pomocy MySQL 4.0
I wydaje mi się, że są to dokładnie oczekiwane wyniki, czyli lista wszystkich osób które teraz są In, i nie zdążyły jeszcze wyjść. ps. Ale, scanner, podobierałeś nazwy kolumn i tabel. Mój phpMyAdmin ledwie sobie z nimi radził, a już np. ustawiene sortowania w tabeli events, przy pomocy kliknięcia w nazwę kolumny, praktycznie graniczyło z cudem. --- edited ---- Co ciekawe jest jeszce prostsze rozwiązanie. Dla czytelności - nie dołączam tabeli persons
gdzie warunek events.iId < events2.iId może być zastąpiony przez events.iTimestamp < events2.iTimestamp, jeśli może się zdarzyć sytuacja, że kolejność id nie informuje nas wcale o kolejności zdażeń (bo np. wiersz był edytowany i została mu nadana nowa wartość i data, a id pozostało to samo). --- edited 2 --- zabawa mi się spodobała. I dzięki temu wiem, że można jeszcze inaczej (ciekawe, czy optymalniej...) ![]()
pojawia się tu wartość 14 i 16 ponieważ zmieniłem sobie typ kolumny na timestamp 14. Ty musiałbyś dostosować tą wartość do długości swojego zapisu daty., -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 22.06.2025 - 06:46 |