Autor Zpráva
hugo777
Profil *
Zdravim,

chcem sa spytat, ako urobit co najefektivnejsie nasledujuci select

1.) mam tabulku: id, datum, test
napr.
1 2011-13-15 aaaa
2 2011-13-15 aaaa
3 2011-13-16 aaaa
4 2011-13-17 aaaa
5 2011-13-17 aaaa

2.) a ja chcem spravit select, ktory mi vyberie vsetky polozky k najblisziemu dnu, teda:

3.)
4 2011-13-17 aaaa
5 2011-13-17 aaaa


Viete mi poradit ako toto spravit jednym selectom?

Dakujem, uz som v tom zufaly.
Kajman_
Profil *
select * from tabulka where datum='2011-13-17'


Ale myslím, že to nikdy nic nevybere, třináctý měsíc jen tak neprotlačíte. Místo konkrétního dne můžete použít i curdate a adddate, ale přijdete o možnost sql cache.
hugo777
Profil *
Kajman:
dakujem, ten mesiac je chyba, predstadme si tam treti mesiac.

Ale toto neriesi moj problem pretoze ja tento sql select mozem robit v ktorykolvek iny den po tom to datume,
chapete, dnes bude 21.03.2011 a chcem stale aby mi vypisalo polozky z najblizsieho dna.

Da sa to?


Teoreticky mozem mat druhu pomocnu tabulku kde budem mat
id datum, napr:
1 2011-03-15
2. 2011-03-16
3. 2011-03-17
(teda tie unikaty)

Viete mi poradit?
YoSarin
Profil
hugo777:
Kajman poradil přesně to, co potřebujete - klíčová jsou slova CURDATE a ADDDATE.
hugo777
Profil *
Pozeram a skusam to, ale nefuguje mi to :(

Neporadite mi prosim, ako to spravne napisat?

Prosiiim
YoSarin
Profil
hugo777:
SELECT * FROM tabulka WHERE datum = ADDDATE(CURDATE(), INTERVAL 1 DAY);
hugo777
Profil *
YoSarin:
nefunguje? nevrati ziadne riadky :(

Preco?
YoSarin
Profil
hugo777:
A je v databázi záznam s odpovídajícím datem (tj. 2011-03-23)? A pokud ano, je ten sloupeček opravdu date? Není to timestamp?
hugo777
Profil *
YoSarin:
A je v databázi záznam s odpovídajícím datem (tj. 2011-03-23)?
nie je tam taky, asi sme sa nepochopili.

Ja chcem najst zaznamy dna ktory je najaktualnejsi, chapes?
YoSarin
Profil
hugo777:
áha, nevím proč jsem z klíčového slova 'test' pochopil že jde o seznam zkoušek, z čehož mi vyplynulo, že nejaktuálnějším dnem bude zítřek. Předpokládám že nejaktuálnější den == dnešek? Pokud ano, pak:
SELECT * FROM tabulka WHERE datum = CURDATE();


teď mi ještě dochází - to nejaktuálnější znamená "nejbližší budoucí", že? Pokud ano, tak výše uvedené SQL ti také nepomůže.
YoSarin
Profil
Doplněk k předchozímu komentáři:
Pro výběr nejbližších položek, které leží v budoucnosti použij:
SELECT * FROM tabulka WHERE datum >= CURDATE() LIMIT X;
kde X je počet výsledků který chceš získat (např. 3 nejbližší události). Pokud chceš všechny události, které se odehrají v nejbližším dni majícím nějakou událost, tak:
SELECT * FROM tabulka WHERE datum >= CURDATE() AND datum <= 
(SELECT MIN(datum) FROM tabulka WHERE datum >= CURDATE());
hugo777
Profil *
YoSarin:
stale sa nechapame zrejme,

ked dam
WHERE datum <= CURDATE() HAVING datum = min(datum)
tak mi vypise najstarsiu polozku, tie ostatne nevypisali nic.

Pro výběr nejbližších položek, které leží v budoucnosti použij: => toto nechcem, ja chcem výběr nejaktulanejších položek, které leží v minulosti od dnesneho dna (teda ak tam bude aj dnesek, tak to je najaktualnejsie, ak minuly tyzden v utorok, tak to je najaktualnejsie.), Zaznam s vyssim datum ako je aktualny sa v databaze nenachadza.

Da sa to?

Dakujem za trpezlivost.
YoSarin
Profil
hugo777: Aha, takže nejnovější starší :) Jsem trouba, který odpovídá dřív než si to sám vyzkouší - předchozí odpověď jsem několikrát opravoval, tak to prosím zkus znovu (jen si otoč většítka na menšítka, tak jako jsi to udělal minule + změň MIN na MAX).
Kajman_
Profil *
Když je 21. a má to vybrat toho 17., tak by to mohlo být takto.
select t1.* from tabulka t1, (select max(t2.datum) datum from tabulka t2 where datum<='2011-03-21') t3 where t1.datum = t3.datum


Pokud v tabulce nejsou datumy z budoucnosti, tak je where uvnitř té závorky zbytečné a je to jen obdoba příkladu z faq.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: