Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Rekordy z ostatniego dnia miesiąca i przedział czasowy
peter_z
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 26.10.2006

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


Ostatnio nie mogę sobie poradzić z poniższym zagadnieniem.
Mam tabelę kursy i w niej dzienne wyceny aktywów.
Potrzebuję wyciągnąć z niej wyceny z ostatniego dnia miesiąca, ale ten dzień nie zawsze wypada w kalendarzowym końcu miesiąca.
Następujące zapytanie wyławia taki rekord bez problemu:
  1. SELECT * FROM `kursy` WHERE `name` = 'nazwa' AND `update-date` LIKE '2008-11%' ORDER BY `update-date` DESC LIMIT 1;


Teraz powstaje pytanie jak to zrobić, aby wyłowić rekordy z zakresu '2007-01' do '2010-01' biorąc pod uwagę powyższe założenia.

Oczywiście mogę zrobić wielokrotne UNION (zwiększając miesiąc), ale może jest jakiś lepszy sposób, który zrobi jakąś pętlę zapytań z dodawaniem miesiąca?
  1. (SELECT * FROM `kursy` WHERE `name` = 'nazwa' AND `update-date` LIKE '2008-10%' ORDER BY `update-date` DESC LIMIT 1)
  2. UNION
  3. (SELECT * FROM `kursy` WHERE `name` = 'nazwa' AND `update-date` LIKE '2008-11%' ORDER BY `update-date` DESC LIMIT 1)


Będę wdzięczny za propozycje.

UPDATE
Kolumna to date, ale mogę zmienić, gdyby to coś pomogło.

Pozdrawiam,
Piotr Zaniewicz

Ten post edytował peter_z 28.03.2010, 16:54:24
Go to the top of the page
+Quote Post
Mchl
post
Post #2





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


Jakiego typu jest kolumna update-date ?
Go to the top of the page
+Quote Post
peter_z
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 26.10.2006

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


Kolumna to date.
Go to the top of the page
+Quote Post
Mchl
post
Post #4





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


Można zacząć od tego:
Kod
SELECT t1.* FROM kursy AS t1
CROSS JOIN
(SELECT name, MAX(`update-date`) AS `update-date` FROM kursy GROUP BY name, MONTH(`update-date`)) AS t2
USING(name, `update-date`);
Go to the top of the page
+Quote Post
peter_z
post
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 26.10.2006

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


Ekstra, działa wyśmienicie.
Dodałem jeszcze grupowanie wg poszczególnych lat, bo tak wyświetlał tylko 12 miesięcy.

A tak wygląda działający SQL, gdyby ktoś potrzebował:
  1. SELECT t1.* FROM `kursy` AS t1
  2. CROSS JOIN
  3. (SELECT `name`, MAX(`update-date`) AS `update-date` FROM `kursy` WHERE `name` LIKE 'nazwa' GROUP BY `name`, YEAR(`update-date`), MONTH(`update-date`)) AS t2
  4. USING(`name`, `update-date`)



Dziękuję serdecznie za pomoc i pozdrawiam,

Piotr Zaniewicz
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 04:21