🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych
5 messages
5 total messages Started by Leszek Zur Thu, 19 Nov 2015 22:53
Najbliższa data z przyszłości lub z przeszłości
#194688
Author: Leszek Zur
Date: Thu, 19 Nov 2015 22:53
42 lines
2774 bytes
MySQL. Mam 2 tabele:
Firmy z polami id, Nazwa
Kontakty z polami idfirmy, Osoba, Data
W tabeli Kontakty zapisywane są kontakty z osobami z firmy wraz z datą 
kontaktu. Potrzebuję wyświetlić tabelę gdzie wyświetlona jest nazwa 
firmy (każda firma jeden raz nawet jak nie było z nią żadnych kontaktów 
albo było ich wiele), osoba i data kontaktu. Kontakt wybierany jest w 
ten sposób, że jeśli dla danej firmy są jakieś kontakty z datą z 
przyszłości (licząc od dzisiaj) to wybierany jest najbliższa data. Jeśli 
nie ma żadnych kontaktów z przyszłości to wybierany jest kontakt ostatni 
z przeszłości. Jeśli firma nie ma żadnych kontaktów to pola Osoba i Data 
powinny zostać puste.

Na przykład mam taką tabelę Firmy:
id Nazwa
1  FirmaA
2  FirmaB
3  FirmaC

Oraz tabelę Kontakty:
idfirmy Osoba Data
1       Adam   2016-10-25
1       Basia  2016-11-22
1       Kasia  2015-05-18
1       Zenek  2015-07-20
2       Franek 2015-02-25
2       Janek  2015-03-29

To powinienem dostać:
Nazwa  Osoba Data
FirmaA Adam  2016-10-25       (najbliższa data z przyszłości)
FirmaB Janek 2015-03-29       (ostatnia data z przeszłości)
FirmaC (puste) (puste)

Oczywiście jak to samo zapytanie wykonam w roku 2017 na tych samych 
danych to dla FirmaA zamiast Adama dostanę Basię.
Zrobiłem to za pomocą 2 widoków - jeden pokazuje dla każdej firmy 
najbliższy kontakt z przyszłości a drugi ostatni kontakt z przeszłości i 
w php wyświetlam odpowiednia wartość. Ale pewnie można to zrobić w samym 
MySQL. Jak ?

Pozdrawiam - Leszek
Re: Najbliższa data z przyszłości lub z przeszłości
#194690
Author: Stokrotka
Date: Fri, 20 Nov 2015 08:53
14 lines
1665 bytes
>... Kontakt wybierany jest w ten sposób, że jeśli dla danej firmy są jakieś 
>kontakty z datą z przyszłości (licząc od dzisiaj) to wybierany jest 
>najbliższa data. Jeśli nie ma żadnych kontaktów z przyszłości to wybierany 
>jest kontakt ostatni z przeszłości. Jeśli firma nie ma żadnych kontaktów to 
>pola Osoba i Data powinny zostać puste.

Wygląda na bazę danych policyjną.

-- 
_____http://ortografia.ma7.eu_____zmiana adresu strony
w zakładce 'inne', nowa wersja syntezatora mowy GdakMini2_99 ,
z nowym głosem
(tekst bez: ó, ch, rz i -ii) Ortografia to NAWYK, często nielogiczny,
ktury ludzie ociężali umysłowo, nażucają bezmyślnie następnym pokoleniom.
Re: Najbliższa data z przyszłości lub z przeszłości
#194691
Author: Leszek Zur
Date: Fri, 20 Nov 2015 10:56
7 lines
1456 bytes
W dniu 2015-11-20 o 09:53, Stokrotka pisze:
> Wygląda na bazę danych policyjną.
>
Nie zrozumiałeś mojego pytania. Ja nie pytałem jak wygląda ta baza ale 
jak lepiej napisać zapytanie.

Leszek\
Re: Najbliższa data z przyszłości lub z przeszłości
#194689
Author: Paweł Broda
Date: Fri, 20 Nov 2015 12:15
50 lines
2567 bytes
najprościej byłoby funkcjami analitycznymi - ale są niestety (?) niedostepne w mysql... 

poniżej masz rozwiązanie w ansi-sql. tylko musisz zamienić oraclowe sysdate na odpowiednik w mysql.

jeśli możesz mieć więcej niż 1 kontakt per firma per dzień to musisz sobie jeszcze jakiś warunek na top 1 ustawić.

WITH min_future_dates AS
 (SELECT id_firmy,
         MIN(data) AS future_date
    FROM kontakty
   WHERE data >= SYSDATE
   GROUP BY id_firmy),

future AS
 (SELECT id_firmy,
         osoba,
         data
    FROM kontakty k
    JOIN min_future_dates d
      ON k.id_firmy = d.id_firmy
     AND k.data = d.future_date),

max_past_dates AS
 (SELECT SELECT id_firmy,
                MIN(data) AS past_date
           FROM kontakty
          WHERE data < SYSDATE
          GROUP BY id_firmy
  ),

past AS
 (SELECT id_firmy,
         osoba,
         data
    FROM kontakty k
    JOIN max_past_dates d
      ON k.id_firmy = d.id_firmy
     AND k.data = d.past_date)

SELECT f.firma,
       coalesce(t.osoba, p.osoba) AS osoba,
       coalesce(t.data, p.data) AS data
  FROM firmy f
  LEFT JOIN future t
    ON (f.id_firmy = t.id_firmy)
  LEFT JOIN past p
    ON (f.id_firmy = p.id_firmy)

Pozdrawiam,
Paweł Broda
Re: Najbliższa data z przyszłości lub z przeszłości
#194692
Author: Marek Horodyski
Date: Mon, 14 Dec 2015 02:22
24 lines
2405 bytes
W dniu czwartek, 19 listopada 2015 23:52:31 UTC+1 użytkownik Leszek Zur napisał:
> MySQL. Mam 2 tabele:
[...]
> Oczywiście jak to samo zapytanie wykonam w roku 2017 na tych samych 
> danych to dla FirmaA zamiast Adama dostanę Basię.
> Zrobiłem to za pomocą 2 widoków - jeden pokazuje dla każdej firmy 
> najbliższy kontakt z przyszłości a drugi ostatni kontakt z przeszłości i 
> w php wyświetlam odpowiednia wartość. Ale pewnie można to zrobić w samym 
> MySQL. Jak ?
> 
> Pozdrawiam - Leszek

Hi,
nie wiem na ile będzie tu zgodny mySql z Oracle, ale powinien to zrobić SQL (tak z głowy, bez testu, ale widzę tu potrzebę rozdzielenia osób i konntaktów z osobami)

select f.nazwa, o.osoba, o.data
from firmy f
left join osoby o on f.id_firmy = o.id_firmy
where o.data = ( select min( current_date - date) from osoby where osoba = o.osoba)

to da null jak nie ma kontaktu, lub wybierze najbliższą datę z przeszłości. Jak pokombinowało by się z liczbą bezwzględną uzyska się obojętny wektor czasu od current_date. Nie wiem na ile może to zrealizować mySql.

Pozdrawiam,
Marek Horodyski
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads