Lista osób mająca odbite wejście

0

Hej,
potrzebuję pomocy w zapytaniu SQL.
Potrzebuję listy osób które mają w ostatnim rekordzie bazy danych przy swoim odbiciu mają wpisane do tablicy wejscie.
Czyli po prostu są jeszcze w biurze.
Kłopot w tym, że ta sama osoba może mieć kilka wejści i wyjść.

Struktura tablicy prosta:
ID,noRFID, Imie, Nazwisko, Data, Godzina,Status(wejscie/wyjscie),dział

1

Co zrobiłeś do tej pory?

0
sieedukuje napisał(a):

Co zrobiłeś do tej pory?

Zasadniczo nie mam pojęcia, jak to zrobić bo potrafię tylko proste zapytania w SQL zrobić.
Próbowałem czegoś takiego w różnych kombinacjach, ale niestety bez rezultatów:

SELECT imie, nazwisko FROM www_odbicia WHERE (select max(id) where r_status=1) GROUP BY imie,nazwisko

0

Jeszcze napisz jak wygląda ten status... Czy to jest 1/0 (wejście wyjście) czy może każda odbicie karty to rekord że statusem "1" czyli że udane...?

0

Jak już dajesz strukturę bazy to dawaj ją tak:

CREATE TABLE `odbicia` (
  `ID` int(11) NOT NULL, 
  `noRFID` int(11) NOT NULL, 
  `Imie` text NOT NULL,
  `Nazwisko` text NOT NULL, 
  `r_Data` text NOT NULL,  
  `Godzina` text NOT NULL, 
  `r_status` int (1) NOT NULL,
  `dzial` text NOT NULL  );
  insert into odbicia values (1,1,'wacek','a','11-01-2020','11:20',1,'H');
  insert into odbicia values (2,1,'wacek','a','12-01-2020','12:20',1,'H');
  insert into odbicia values (3,1,'jacek','a','12-01-2020','08:20',1,'H');

Nikt nie będzie specjalnie stawiał bazy, żeby sprawdzić to twoje zapytanie (chociaż akurat tutaj widać od razu że jest bez sensu). A tak to sobie można wrzucić w fiddlera i za sekundę sprawdzić
Sprawa druga: jest cały internet z podstawami SQL, nie będziemy tutaj robić drugiej elektrody, ale to naprawdę podstawy podstaw. A rzut oka na kawałek twojego zapytania (o ten: "select max(id) where r_status=1") i już nikt ci nie chce pomóc, bo każdy myśli że szukasz gotowca
To co chcesz zrobić powinno wyglądać tak:

SELECT imie, nazwisko, max(r_data), max(godzina)
FROM odbicia 
WHERE  r_status=1
Group BY imie,nazwisko

Wiadomo nazwy pól musisz sobie poprawić, bo nie dałeś struktury w poście

Napisałem ten post tylko po to żeby nie robić swojej roboty

2

select * from tabela t join (select max(id) id from tabela group by imie, nazwisko ) x on t.id=x.id

0

Dziękuję bardzo za uwagi:

CREATE TABLE `www_odbicia` (
 	`id` INT(11) NOT NULL AUTO_INCREMENT,
 	`noRFID` TEXT NOT NULL COLLATE 'utf8_bin',
 	`imie` TEXT NOT NULL COLLATE 'utf8_bin',
 	`nazwisko` TEXT NOT NULL COLLATE 'utf8_bin',
 	`r_data` TEXT NOT NULL COLLATE 'utf8_bin',
 	`czas` TEXT NOT NULL COLLATE 'utf8_bin',
 	`dzial` TEXT NOT NULL COLLATE 'utf8_bin',
 	`status` INT(11) NULL DEFAULT NULL,
 	PRIMARY KEY (`id`)
 )

Poniższe zapytanie nie uwzglęnia jeżeli wyjście(status =0) jest ostatnim recordem. Wtedy taka osoba nie powinna pojawić się w wynikach.
Bierze zawsze ostatnie wejście(mimo, że później było wyjście).

 SELECT imie, nazwisko, max(r_data), max(godzina)
 FROM www_odbicia 
 WHERE  r_status=1
 Group BY imie,nazwisko
Marcin.Miga napisał(a):

select * from tabela t join (select max(id) id from tabela group by imie, nazwisko ) x on t.id=x.id

Dziękuję Bardzo.
Dodałem na końcu "where status=1" i wygląda, że jest OK.
Można zamykać temat
Pozdrawiam!

0
mavitx0 napisał(a):
Marcin.Miga napisał(a):

select * from tabela t join (select max(id) id from tabela group by imie, nazwisko ) x on t.id=x.id

Dziękuję Bardzo.
Dodałem na końcu "where status=1" i wygląda, że jest OK.
Można zamykać temat
Pozdrawiam!

Można też prościej moim zdaniem... Jeśli zakładamy, że wejście i wyjscie mają różne statusy to wystarczy zliczyć występowanie r_status (funkcja count) a potem użyć having I sprawdzić czy ta liczba z count jest parzysta. Jeśli jest tzn że kogoś nie ma (bo jest tyle samo wejść ile wyjść)

 SELECT imie, nazwisko, COUNT(r_status) AS 'stat'
 FROM odbicia 
 Group BY noRFID
 HAVING (tutaj sobie wpisz właściwy warunek, chyba nie myślałeś, ze podam ci na tacy :P)

Dodatkowe podpowiedzi:

  • zoptymalizuj tabelę... po co ci typy TEXT na wszystkich kolumnach, spokojnie wystarczyło by varchar, na r_status TINYINT
  • czemu nie grupujesz po id usera? np po noRFID (które będzie chyba unikalne), przecież może się zdarzyć sytuacja, że masz dwóch pracowników, którzy mają takie samo imię i nazwisko
0

Dziękuję za podpowiedzi SQL to czarna magia dla mnie :)
Nawet nie pomyślałem, że dwie osoby mogą mieć to samo imie i nazwisko :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1