Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] wyszukanie rekordów które nie wystąpiły w konkretnej dacie
Forum PHP.pl > Forum > Przedszkole
Booster
Witam, posiadam 3 tabele z
ID - id usługi
ID_oso - id osoby
Data - data wykonania usługi

Potrzebuję znaleźć Osoby które miały wykonanie usługi w datach poniżej 2008 a nie miały wykonanych po 2008.

Czy ktoś może mi podpowiedzieć jaką funkcję/zapytanie mogę użyć do tego aby wyszukać tak wynik ? Lub jeśli ktoś ma inny pomysł na znalezienie tych osób to z chęcią wysłucham.

Jedyne co mi przychodzi aktualnie na myśl to
  1. SELECT 'id', 'id_oso', 'data' FROM `uslugi` WHERE DATA <= '01-01-2008'

Ale to wyświetli wyniki usług przed 2008 jak zamienię na => 01-01-2008 to wyświetli osoby które miały.
Problem Tkwi w tym że nie którzy po 2008 r nie mieli wpisywanych usług i wyświetlenie osób po 2008 które nie mają usług mija się z celem ponieważ wyświetli mi osoby które zostały dopiero co dodane a ja chce wyeliminować osoby które od 2008r nie odwiedzały firmy

Ew można znaleźć wszystkie osoby które zostały zarejestrowane przed 2008 r czyli zaznaczenie id i data_rej z innych tabel wtedy będą wyswietlon osoby zarej przed 2008 i jeszcze żeby przefitrowało i wyświetliło te osoby które NIE miały usług po 2008 roku o tak chyba bedzie najlepiej lecz jestem lajkiem i nie znam zapytan jakich mógłbym uzyć ...
rocktech.pl
Witam.

1. Pole data jest typu DATETIME, DATE?
2.
  1. SELECT
  2. 'id', 'id_oso', 'data'
  3. FROM
  4. `uslugi`
  5. WHERE
  6. `data` BETWEEN '01-01-1970' AND '01-01-2008';
b4rt3kk
Cytat(rocktech.pl @ 1.04.2014, 11:14:22 ) *
Witam.

1. Pole data jest typu DATETIME, DATE?
2.
  1. SELECT
  2. 'id', 'id_oso', 'data'
  3. FROM
  4. `uslugi`
  5. WHERE
  6. `data` BETWEEN '01-01-1970' AND '01-01-2008';


To nie zda egzaminu, bo wyświetli tylko osoby, które miały usługi przed 2008, a nie implikuje to faktu, że dane osoby nie mogły mieć usług po 2008 roku. Prawidłowe zapytanie:

  1. SELECT
  2. u.id_oso
  3. FROM uslugi u
  4. WHERE DATE(`data`) < '01-01-2008'
  5. AND id_oso NOT IN (SELECT id_oso FROM uslugi WHERE DATE(`data`) >= '01-01-2008');
Damonsson
Można prościej:

  1. SELECT id, id_oso, MAX(`data`) AS `data` FROM uslugi
  2. GROUP BY id_oso
  3. HAVING `data` <= '2008-01-01'
Booster
rocktech.pl dzieki za chęci smile.gif

b4rt3kk witam sąsiada z Lublina wink.gif i również dzieki za zaangażowanie jednach chyba coś wyswietla nie tak bardziej szczegółowo to powiem że mam tak w bazie np.
beneficjenci i tam mam dwie tabele bnf_id i bnf_data_rej
w drugim mam
uslugi_doradcze i tam mam ud_id, ud_bnf_id, ud_data

i czy mogłbyś mi jakoś zmodyfikować zapytanie aby coś wyszlo takiego
zaznacza z beneficjenci wszystkie osoby (bnf_id) i sortuje że wyswietla tylko zarejestrowane przed 2008r czyli <= 2008-01-01
Następnie
zczytuje to co zrobiłeś że szuka w uslugi_doradcze ud_bnf_id = bnf_id i sprawdza te osoby czy miały usługi po > 2008-01-01 jeśli nie to wtedy mi wyświetla questionmark.gif
a wyniki wyświetlania były
bnf_id, bnf_imie, bnf_nazwisko z gruby beneficjenci questionmark.gif

bnd_id - id beneficjenta w beneficjenci
bnf_data_rej - data rejestracji wbeneficjenci
bnf_imie, bnf_nazwisko w beneficjenci
ud_bnf_id - id beneficjentów w usługach doraczych takie jak w bnf_id
ud_id - id usługi
ud_data - data wykonania usługi


Damonsson czy Twoje zapytanie nie wyswietli osób które miały usługi przed 2008 ? a jednocześnie wyświetli również te które nie miały po 2008 więc mija się z celem ?
więc coś takiego jak TY napisałeś ale nie Having tylko odwrotność tego nie wiem czy cos jest takiego NOT HAVING i >2008-01-01 questionmark.gif wtedy wyswietli osoby ktore od 2008 nie mają usług
Damonsson
Moje zapytanie robi to samo co zapytanie @b4rt3kk + grupuje Ci jeszcze po id_oso
Tylko jest szybsze i prościej zapisane.


A co Ty chcesz zrobić to ja nie mam pojęcia, bo nic nie rozumiem z tego co napisałeś.
mmmmmmm
@Damonsson - co ztego, że szybsze i prościej napisane, skoro niepoprawne?
Nie grupujesz po id...
Damonsson
Obydwa zapytania wyszukują osoby, które mają usługi z datą starszą niż 2008, ale nie mają żadnej usługi nowszej niż w 2008. Więc co znaczy niepoprawne w stosunku do @b4rt3kk wg Ciebie?
Booster
hmm no może i tak nie wiem myślałem że w Twoim nie są uwzględnione osoby ktore nie maja usług po 2008

  1. SELECT
  2. ud_bnf_id, bnf_id, bnf_imie, bnf_nazwisko
  3. FROM uslugi_doradcze, beneficjenci
  4. WHERE DATE(`ud_data`) < '01-01-2008'
  5. AND ud_bnf_id NOT IN (SELECT ud_bnf_id FROM uslugi_doradcze WHERE DATE(`ud_data`) >= '01-01-2008')
  6. GROUP BY ud_bnf_id


czy takie coś w teorii jest poprawne ? bo Twojego Damonsson nie wiem jak moge zmodyfikować
Damonsson
W teorii tak by to wyglądało:

  1. SELECT MAX(ud_data) AS ud_data, bnf_id, bnf_imie, bnf_nazwisko FROM uslugi_doradcze
  2. JOIN beneficjenci ON ud_bnf_id = bnf_id
  3. GROUP BY bnf_id
  4. HAVING ud_data <= '2008-01-01'


Czyli:

Pokaż wszystkich użytkowników, którzy mieli swoją ostatnią usługę przed dniem: 01.01.2008
Booster
Super smile.gif ost wykonana usługa i imię i nazwisko i ID dzięki Damonsson za szybką pomoc smile.gif muszę jeszcze poszperać w funkcjach i się poduczyć heh 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.