Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] wyszukanie rekordów które nie wystąpiły w konkretnej dacie, Lub inne rozwiązanie
Booster
post
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 24.06.2013
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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ć ...

Ten post edytował Booster 1.04.2014, 09:52:00
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
rocktech.pl
post
Post #2





Grupa: Zarejestrowani
Postów: 587
Pomógł: 131
Dołączył: 8.02.2010

Ostrzeżenie: (0%)
-----


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';
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #3





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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');


Ten post edytował b4rt3kk 1.04.2014, 10:58:43
Go to the top of the page
+Quote Post
Damonsson
post
Post #4





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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'


Ten post edytował Damonsson 1.04.2014, 11:29:56
Go to the top of the page
+Quote Post
Booster
post
Post #5





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 24.06.2013
Skąd: Lublin

Ostrzeżenie: (0%)
-----


rocktech.pl dzieki za chęci (IMG:style_emoticons/default/smile.gif)

b4rt3kk witam sąsiada z Lublina (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/questionmark.gif)
a wyniki wyświetlania były
bnf_id, bnf_imie, bnf_nazwisko z gruby beneficjenci (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/questionmark.gif) wtedy wyswietli osoby ktore od 2008 nie mają usług

Ten post edytował Booster 1.04.2014, 11:46:32
Go to the top of the page
+Quote Post
Damonsson
post
Post #6





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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ś.
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #7





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


@Damonsson - co ztego, że szybsze i prościej napisane, skoro niepoprawne?
Nie grupujesz po id...
Go to the top of the page
+Quote Post
Damonsson
post
Post #8





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Booster
post
Post #9





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 24.06.2013
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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ć
Go to the top of the page
+Quote Post
Damonsson
post
Post #10





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Booster
post
Post #11





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 24.06.2013
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Super (IMG:style_emoticons/default/smile.gif) ost wykonana usługa i imię i nazwisko i ID dzięki Damonsson za szybką pomoc (IMG:style_emoticons/default/smile.gif) muszę jeszcze poszperać w funkcjach i się poduczyć heh (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 23:48