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
Author: Leszek Zur
Date: Thu, 19 Nov 2015 22:53
Date: Thu, 19 Nov 2015 22:53
42 lines
2774 bytes
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
Author: Stokrotka
Date: Fri, 20 Nov 2015 08:53
Date: Fri, 20 Nov 2015 08:53
14 lines
1665 bytes
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
Author: Leszek Zur
Date: Fri, 20 Nov 2015 10:56
Date: Fri, 20 Nov 2015 10:56
7 lines
1456 bytes
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
Author: Paweł Broda
Date: Fri, 20 Nov 2015 12:15
Date: Fri, 20 Nov 2015 12:15
50 lines
2567 bytes
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
Author: Marek Horodyski
Date: Mon, 14 Dec 2015 02:22
Date: Mon, 14 Dec 2015 02:22
24 lines
2405 bytes
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