Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[MySQL] Lastige query

Pagina: 1
Acties:

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 30-10 14:12
Hoi,

Ik ben zelf best handig met SQL, maar voor dit probleem heb ik nog geen mooie query kunnen bedenken:

Ik heb een logfile, waar iedere record een timestamp (int) bevat. Nu wil ik de tien laatste records ophalen, maar maximaal een record per dag. Het moeten er dus tien zijn, maar tussen de timestamps moet 86400s zitten.

Ik kan natuurlijk met PHP aan de slag, maar ik hoop stiekum dat dit ook gewoon direct in SQL kan. Welke handigerd / slimmerik weet hier een mooie query voor?

Alvast bedankt!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 14:26

Creepy

Tactical Espionage Splatterer

Je weet hopelijk dat het hier geen afhaalbalie voor code/queries is he? ;)
Dus: wat heb je zelf al geprobeerd? Wat lukte daar niet mee? etc. etc. , zie ook Programming Beleid - De Quickstart

Maar als je de timestamp kan omzetten naar een dag, dan kan je vervolgens de max timestamp ophalen per dag (max, group by) en dat vervolgens limiteren voor de laatste 10.

[ Voor 26% gewijzigd door Creepy op 12-09-2008 10:37 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 30-10 14:12
Hoi Creepy,

Ik snap dat het hier geen kwestie is van u vraagt wij draaien :) Ik zoek dan ook niet persee een kant-en-klare query, meer de manier van aanpakken. Mijn enige idee was gaan parsen in PHP, en das natuurlijk niet erg aantrekkelijk.

Jouw hints waren precies wat ik zocht. Omzetten van die timestamp laat ik maar even zitten, heb gewoon een veld 'date' toegevoegd wat d-m-Y bevat. Bedankt!

  • Brantje
  • Registratie: Juli 2004
  • Laatst online: 05-11 19:40

Brantje

De post is daar >>

Je kan ook de timestamp gewoon gebruiken.
Anders heb je weer een extra veld ;).

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 11-11 11:26
PL/SQL geeft hier een oplossing, dien je wel een Oracle DB te hebben;)

Ik zelf zie ook niet echt een oplossing.

Je kunt het wel hard in je SQL statement programmeren met gebruik van NOW(). Maar hier dien je alsnog een lus in te maken via php om terug te gaan in het aantal dagen.

  • Cruz
  • Registratie: November 1999
  • Laatst online: 17-10 14:07
Ik zit te denken aan iets als:

SELECT *, timestamp - MOD(timestamp, 86400) as day FROM logfile ORDER BY timestamp desc GROUP BY day LIMIT 10

ofzo :)

Order by & group by gaat natuurlijk niet samen, zit zou moeten werken:
SELECT *, timestamp - MOD(timestamp,86400) AS day FROM logfile GROUP BY day HAVING MIN(timestamp) LIMIT 10;

(er vanuit gaande dat je timestamp kolom 'timestamp' heet en je tabel 'logfile')

[ Voor 46% gewijzigd door Cruz op 12-09-2008 10:20 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 14:26

Creepy

Tactical Espionage Splatterer

Order by & group by gaat natuurlijk niet samen
Dat gaat prima samen? Je kan prima eerst groeperen en vervolgens de resultaten sorteren. Waarom denk je dat dat niet kan?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Tiemez
  • Registratie: December 2003
  • Laatst online: 24-10-2022
Creepy schreef op vrijdag 12 september 2008 @ 11:12:
[...]

Dat gaat prima samen? Je kan prima eerst groeperen en vervolgens de resultaten sorteren. Waarom denk je dat dat niet kan?
Ik denk dat hij bedoelt dat zijn voorbeeld niet werkt, aangezien hij eerst ORDER BY doet en daarna GROUP BY in plaats van andersom. Eerst GROUP BY en daarna ORDER BY werkt (gelukkig!) uiteraard wél. :)

  • Cruz
  • Registratie: November 1999
  • Laatst online: 17-10 14:07
Klopt, en je wilt eerst sorteren voordat je gaat groeperen (anders gooi je misschien/waarschijnlijk de oudste record weg).

Group by / having min(date) zou dat op moeten vangen :)

Verwijderd

Cruz schreef op vrijdag 12 september 2008 @ 10:13:
Ik zit te denken aan iets als:

SELECT *, timestamp - MOD(timestamp, 86400) as day FROM logfile ORDER BY timestamp desc GROUP BY day LIMIT 10

ofzo :)

Order by & group by gaat natuurlijk niet samen, zit zou moeten werken:
SELECT *, timestamp - MOD(timestamp,86400) AS day FROM logfile GROUP BY day HAVING MIN(timestamp) LIMIT 10;

(er vanuit gaande dat je timestamp kolom 'timestamp' heet en je tabel 'logfile')
niet zo moeilijk doen, volgens mij werkt GROUP BY Day(timestamp) ook al :)

edit: ow klopt niet helemaal, mysql heeft allemaal tijds en datum functies als 'hour', 'second', 'month' maar day() doet weer net niét wat je verwacht.. maar goed GROUP BY Date(timestamp) moet ook werken, en anders moet je even door de datum functies van mysql bladeren, genoeg keuze

[ Voor 19% gewijzigd door Verwijderd op 12-09-2008 13:30 ]

Pagina: 1