[SQL] Probleem met HAVING en MAX*

Pagina: 1
Acties:

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Hey, ik heb een klein sql probleem waar ik maar niet uitkom:

Ik heb de volgende tabel:
code:
1
2
3
log_id | klant_ID | logdatum | resultaatcode
1    1   1127145935     110
2    1   1127145950     710


Als ik hierop de volgende query loslaat, dan zou ik ( volgens mij) rij 2 als resultaat moeten terugkrijgen, Helaas krijg ik dit niet; er komen 0 rijen uit als resultaat.
Als ik HAVING max( logdatum ) = logdatum verander in HAVING max( logdatum ) > logdatum dan krijg ik er wél het eerste record uit! Ik kom er ff niet uit, waarzit mijn denkfout?

code:
1
2
3
4
SELECT  * 
FROM  `bel_log` 
GROUP  BY klant_ID
HAVING max( logdatum )  = logdatum;


in het kort: het is de bedoeling om pér klant_ID de logregel met het hoogste timestamp te selecteren(logdatum); de laatste log .

EDIT: ik zie nu dat ik een nogal crappy topictitel heb gemaakt, zou iemand dat ff kunnen veranderen?

[ Voor 9% gewijzigd door THIJZEL op 29-08-2005 23:17 ]


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
je hebt een groot sql probleem, dat je sql server dit al pakt ( oftewel welke sql ). select * en een group by hoort niet te kunnen ( waarschijnlijk mysql dus ).

Wat je nu zegt is :
1 : selecteer alle velden ( resultaat regel 1 en 2 )
2 : groepeer dit by klant_id ( regel 1 en 2 hebben hetzelfde klantid dus waar moet ik op groeperen, weet je wat ik gok gewoon maar wat.)
3 : waar het maximum logdatum is de logdatum.

Ik weet niet wat je bedoelt ( omschrijf eens wat je zoekt ) maar waarschijnlijk bedoel je :
code:
1
2
3
4
select klant_id ,max(logdatum) as maxlogdatum, distinct(resultaat) as distresultaat
from bel_log
where maxlogdatum=logdatum
group by klant_id

of normale sql ( bovenstaande stukje werkt waarschijnlijk wel in mysql.
code:
1
2
3
4
select * 
from bel_log
order by logdatum desc
limit 0,1

voor mssql moet je ipv limit even op top zoeken

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
De server is inderdaad een mysql server.
wat ik wil doen is: Selecter pér klantid het record met de hoogste logdatum uit bel_log.
Ofwel, voor alle klanten met logs de laatst ingevoerde log selecteren.

[ Voor 4% gewijzigd door THIJZEL op 30-08-2005 00:18 ]


  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Of iets als:
SQL:
1
2
3
4
5
6
select *
from bel_log b1
where logdatum=
    (select max(logdatum) 
     from bel_log b2 
     where b1.klantid=b2.klantid)

Als dit natuurlijk een versie van MySQL is die ja zegt tegen subqueries.

[ Voor 25% gewijzigd door Haploid op 30-08-2005 03:02 ]

Hey, I came here to be drugged, electrocuted and probed, not insulted.


  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Haploid schreef op dinsdag 30 augustus 2005 @ 02:59:
Of iets als:
SQL:
1
2
3
4
5
6
select *
from bel_log b1
where logdatum=
    (select max(logdatum) 
     from bel_log b2 
     where b1.klantid=b2.klantid)

Als dit natuurlijk een versie van MySQL is die ja zegt tegen subqueries.
Nee helaas 4.0.x geloof ik, dit was ook al in me op gekomen, maar de mysql versie is de beperking.

[ Voor 13% gewijzigd door THIJZEL op 30-08-2005 14:45 ]


  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
code:
1
2
3
4
5
6
SELECT
  klant_ID,
  MAX(logdatum) AS logdatum
FROM bel_log
GROUP BY
  klant_ID


Opties:
1. Dit is helemaaaal niet wat je bedoelt.
2. Dit is niet zo heel moeilijk.

  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Waarom komt iedereen keer op keer met de zelfde vraag die gewoon in de handleiding staat?

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Dit is niet helemaal wat hij bedoelt. In de handleiding gaat het over 1 maximum prijs waar de dealer(s) bij worden gezocht. De TS wil het PER klant_ID.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:50

Creepy

Tactical Espionage Splatterer

Graveheart: kijk nog eens naar de link die jochemd geeft dan, die geeft namelijk per artikel de dealer met de hoogste prijs.
Hij wil per klantid de regel (dealer, resultaatcode, whatever) met de hoogste logdatum. Dat lijkt me toch redelijk hetzelfde ;) Zolang je alleen per klant Id de laatste logdatum wilt dan klopt jou query. Als je hier een ander veld bij wilt selecteren (maar niet groeperen) gaat jouw query niet meer op.

Overigens heb ik dit probleem vaker voorbij zien komen de laatste tijd. Voor de volledigheid: dit heet een gesynchroniseerde subquery. (Iets wat in MySQL alleen in versie 4.1 en hoger kan. In de link van jochemd staan overigens alternatieven voor 4.0 en lager.)

[ Voor 50% gewijzigd door Creepy op 30-08-2005 23:14 ]

"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


  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Inderdaad je hebt gelijk. Ik kan alleen in het voorbeeld van de TS niet zien of andere velden verschillen of alleen klant_ID. Als deze hetzelfde zijn, is de database niet goed genormaliseerd, maar werkt mijn methode wel :)

  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Graveheart schreef op woensdag 31 augustus 2005 @ 22:44:
Inderdaad je hebt gelijk. Ik kan alleen in het voorbeeld van de TS niet zien of andere velden verschillen of alleen klant_ID. Als deze hetzelfde zijn, is de database niet goed genormaliseerd, maar werkt mijn methode wel :)
Maar jouw methode geeft alleen klantid en logdatum. Hij wil het hele record hebben, dus met alle kolommen erop en eraan. En dat kun je niet in 1 query doen zonder subqueries.

Hey, I came here to be drugged, electrocuted and probed, not insulted.


  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Haploid schreef op donderdag 01 september 2005 @ 08:30:
[...]

Maar jouw methode geeft alleen klantid en logdatum. Hij wil het hele record hebben, dus met alle kolommen erop en eraan. En dat kun je niet in 1 query doen zonder subqueries.
Zoals ik al zei, dit werkt wel als alle velden verder hetzelfde zijn, maar dat kan ik niet uit de post van de TS halen.
Als deze hetzelfde zijn, is de database niet goed genormaliseerd, maar...

[ Voor 14% gewijzigd door Fles op 01-09-2005 13:28 ]


  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Graveheart schreef op donderdag 01 september 2005 @ 09:22:
[...]

Zoals ik al zei, dit werkt wel als alle velden verder hetzelfde zijn, maar dat kan ik niet uit de post van de TS halen.
Tja, als alle velden verder hetzelfde zijn.... dat is echt een vereiste waar geen enkele database aan zal voldoen. Of het moet om een soort test tabel gaan die zoveel mogelijk redundante data bevat, haha. 8)7

Hey, I came here to be drugged, electrocuted and probed, not insulted.

Pagina: 1