[mysql] limit probleem

Pagina: 1
Acties:

  • Haranaka
  • Registratie: September 2000
  • Laatst online: 07-06 23:13
Ik wil met een query gegevens halen uit mijn database (net als iedereen :) ). Alleen ik loop tegen het volgende probleem aan.
Ik heb een table die bevat voor iedere datum een entry. Nu wil ik de laatste 30 dagen selecteren, en wel dat hij als eerste de meest recente data geeft.
Ik kom er niet uit, wel lukt het me om data te sorteren in de juiste volgorde, en ook wel om alleen de laatste 30 te selecteren, maar dat lukt me niet tegelijk. Waar ik eigenlijk naar op zoek ben is het commando de laatste 30 te selecteren

select * from history order by date limit 30;
Leverd niet de juiste data, maar wel in de goede volgorde.

select * from history order by date DESC limit 30;
Leverd me de juiste data op, maar niet in de goede volgorde . Ik wil deze data omgekeerd hebben.

Iemand die me op weg kan helpen naar het zoeken van de juiste oplossing?

...


Verwijderd

Je kan volgens mij iig je recordset verplaatsen naar het laatste item en zo steeds 1 terug gaan.

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 02-06 23:18
code:
1
SELECT * FROM history ORDER BY date ASC LIMIT 0, 30

doet het ook niet goed??

en als je niet alle kolommen uit de tabel benut is het sneller om de kolommen apart te noemen ipv * ;)

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

select * from history order by date DESC limit 0, 30;

en zo?

Systeem | Strava


Verwijderd

Misschien dat een van deze twee werkt:

SELECT * FROM history ORDER BY date ASC LIMIT 0,30
SELECT * FROM history ORDER BY date DESC LIMIT 0,30

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Ik begin trouwens te vermoeden dat het ligt aan de manier waarop jij je datum opslaat want je query's zijn beide goed volgens mij. Vertel daar eens iets over.

Systeem | Strava


Verwijderd

Kan dit wel?

Wat deze persoon wil is dat hij de laatste 30 records wil zien, maar als je met desc doet kan krijg je ook de datums van groot naar klein. En die datums moeten dan van klein naar groot.

dus zo:

waarde 30-05-2002
waarde 31-05-2002
waarde 01-06-2002

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Hij wil de laatste datum eerst. Dat is dus volgens mijn redenatie de grootste datum en dus moet ie DESC doen.

Systeem | Strava


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Op donderdag 04 april 2002 13:54 schreef haltink het volgende:
Kan dit wel?

Wat deze persoon wil is dat hij de laatste 30 records wil zien, maar als je met desc doet kan krijg je ook de datums van groot naar klein. En die datums moeten dan van klein naar groot.

dus zo:

waarde 30-05-2002
waarde 31-05-2002
waarde 01-06-2002
Dat is ASC (ascending - optellend van laag naar hoog)

Maar als de datum op deze wijze is opgeslagen is het kennelijk geen date field. Dan is het sorteren erg lastig (zo niet onmogelijk) voor de database. Verder is het niet verstandig om een veld een naam te geven die 'reserved' is. Dat kan later problemen geven.

Programmer - an organism that turns coffee into software.


Verwijderd

Op donderdag 04 april 2002 14:01 schreef LuCarD het volgende:

[..]

Dat is ASC (ascending - optellend van laag naar hoog)

Maar als de datum op deze wijze is opgeslagen is het kennelijk geen date field. Dan is het sorteren erg lastig (zo niet onmogelijk) voor de database. Verder is het niet verstandig om een veld een naam te geven die 'reserved' is. Dat kan later problemen geven.
Als je asc doet dan krijg je het te zien als grootste datum boven en zo steeds kleiner. Maar zo heb je dus de data wel, maar niet juist gesorteerd, omdat het van klein naar groot moet.

Zie ik het nu fout of droom ik gewoonweg!

  • Haranaka
  • Registratie: September 2000
  • Laatst online: 07-06 23:13
De datums zijn gewoon opgeslagen als een date (bv 2002-03-28)
Ik wil de boel ASC sorteren omdat ik van de data een grafiek wil maken en dan is het wel zo mooi als de tijd van vroeger naar nu zou lopen op de X as.

De database is nu gevult met datums vanaf 1 maart, dus iets meer dan 30 dagen.

Op dit moment geeft
SELECT * FROM history ORDER BY date ASC limit 5, 30
De juiste data zoals ik het wil hebben. Maar morgen dan is de data base verder gevuld en moet het ASC limit 6, 30 worden.

Hopelijk is het probleem nu wat duidelijker.

...


  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 02-06 23:18
misschien is het een idee om je datum (bijvoorbeeld 10 maart 2002) zo op te slaan in de database:
code:
1
20020310

dan kun je ze altijd netjes sorteren
tenminste zo heb ik het wel gedaan, no problemo :)

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

dat als varchar is fout
dan zit je dus nu te klooien pardon my french
dus verander het gewoon is het simpelst, snelst en flexibelst imho

Doet iets met Cloud (MS/IBM)


Verwijderd

Ik zeg het altijd in dit geval:
sla data op als UNIX timestamps (time() dus!). Neem in je database een int veld en je bent klaar.

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Je misbruikt de limit voor iets waar het niet voor bedoelt is.

Kijk eens naar date_time functies http://www.mysql.com/doc/D/a/Date_and_time_functions.html

Deze kan je gewoon in je where clause gebruiken.

bv
SELECT something FROM table
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;

Laatst 30 dagen.
edit:
[quote]
Op donderdag 04 april 2002 14:18 schreef daniel_hoenderdos het volgende:
Ik zeg het altijd in dit geval:
sla data op als UNIX timestamps (time() dus!). Neem in je database een int veld en je bent klaar.
[/quote]

Ze hebben de date field niet voor nix gemaakt..... Je kan veel meer veel makkelijker met een date field dan met een unix_timestamp in een int field!


Programmer - an organism that turns coffee into software.


Verwijderd

Op donderdag 04 april 2002 14:19 schreef LuCarD het volgende:
Je misbruikt de limit voor iets waar het niet voor bedoelt is.

Kijk eens naar date_time functies http://www.mysql.com/doc/D/a/Date_and_time_functions.html

Deze kan je gewoon in je where clause gebruiken.

bv
SELECT something FROM table
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;

Laatst 30 dagen.
Hier sluit ik me bij aan.
Pagina: 1