Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySQL] Verkeerde waarden met group by en having *

Pagina: 1
Acties:

  • Lucky_me
  • Registratie: November 2000
  • Laatst online: 19-09-2024
Ik heb een probleempje met mijn query in MySQL 4.1, volgens mij zou hij gewoon moeten werken, maar hij geeft verkeerde waarden terug. Eerst een overzicht van de tabellen:

tabel1
track_id
track_lat
track_lon
track_time (datetime)

tabel2
bericht_id
bericht_tekst
bericht_timestamp (timestamp)

De query zou bij ieder bericht het record van track moeten tonen wat qua datum en tijd het dichtsbijzijnd is (zowel negatief als postief). Op een of andere manier is het "HAVING" gedeelte niet werkend, en heb geen idee waarom.

SELECT * , ABS( TIMEDIFF( track_time, bericht_timestamp ) ) AS verschil
FROM bericht, track
GROUP BY bericht_ID
HAVING MIN('verschil')

Testdata om mee te werken is in volgende dump te vinden
[URL is weggehaald]

Met deze dump zou ik dus 2 records als resultaat moeten krijgen waarbij het verschil dus 2 is.
Hoop dat iemand me kan helpen,

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

code:
1
HAVING MIN('verschil')

Ik neem aan dat dit een typefout is? Wat je je echte query want bij een HAVING hoort een vergelijking (iets als HAVING verschil = MIN(verschil)) en je vraagt nu de MIN van een string op i.p.v. het geselecteerde verschil. Daarnaast moet je ook eens kijken naar de group by, alleen MySQL staat deze vorm toe, bij andere (R)DBMS'en zul je alle niet aggregated fields moeten openemen.

Ik heb ook de topictitel wat opgeleukt, alleen een MySQL tag zegt natuurlijk niks over je probleem.

[ Voor 8% gewijzigd door Creepy op 31-07-2007 17:29 ]

"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


  • Lucky_me
  • Registratie: November 2000
  • Laatst online: 19-09-2024
Hmmm ok, dat was een typefoutje, maar...

Wanneer ik onderstaande query gebruik, en verschil als kolomnaam wil gebruiken, herkent hij die niet, wanneer ik verschil vervang door "ABS( TIMEDIFF( track_time, bericht_timestamp ) )", dan lukt het wel, dus is niet heel erg belangrijk.

Maar ik krijg 0 rijen als resultaat?, kan niet goed zijn...

code:
1
2
3
4
SELECT * , ABS( TIMEDIFF( track_time, bericht_timestamp ) ) AS verschil
FROM bericht, track
GROUP BY bericht_ID
HAVING verschil = MIN(verschil)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Misschien werkt iets als

HAVING verschil <= ALL verschil

Moet zeggen dat ik in mijn dagelijks praktijk de any-operator te weinig gebruik om dat met zekerheid uit mijn hoofd te kunnen zeggen :)

  • Lucky_me
  • Registratie: November 2000
  • Laatst online: 19-09-2024
Na wat puzzelen er toch uitgekomen, voor degenen die het antwoord nog willen weten hier de de query. Het bleek toch simpeler als gedacht

code:
1
2
3
SELECT * , MIN( ABS( TIMEDIFF( track_time, bericht_timestamp ) ) ) AS verschil
FROM bericht, track
GROUP BY bericht_ID


Van mij mag er een slotje op...

[ Voor 6% gewijzigd door Lucky_me op 31-07-2007 19:27 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Een slotje is niet nodig op een topic als je je oplossing hebt. Zie daarvoor ook onze faq betreffende topiceinde.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Lucky_me schreef op dinsdag 31 juli 2007 @ 19:27:
Na wat puzzelen er toch uitgekomen, voor degenen die het antwoord nog willen weten hier de de query. Het bleek toch simpeler als gedacht

code:
1
2
3
SELECT * , MIN( ABS( TIMEDIFF( track_time, bericht_timestamp ) ) ) AS verschil
FROM bericht, track
GROUP BY bericht_ID
Als je de track wil met het kleinste tijdsverschil ben je daar niet mee klaar. Want zodra je begint te groeperen verlies je de relatie tussen je individuele rijen, je krijgt nu de laagste difference die er is, getoond bij een willekeurige gekozen track bij elk bericht.

Volgens mij moet je zoiets hebben:
SQL:
1
2
3
4
5
6
SELECT * , ABS( TIMEDIFF( track_time, bericht_timestamp )) AS verschil
FROM bericht b
  JOIN track t ON 
    ABS( TIMEDIFF( track_time, bericht_timestamp )) =
          (SELECT MIN(ABS( TIMEDIFF( track_time, bericht_timestamp ))
           FROM bericht b2, track WHERE b2.bericht_id = b.bericht_id)


Wat overigens geen goedkope query is.
Van mij mag er een slotje op...
Als iets opgelost is komt er geen slotje op hoor :)

  • Lucky_me
  • Registratie: November 2000
  • Laatst online: 19-09-2024
Idd, die query was (wederom) niet helemaal juist ( ik moet eens wat beter gaan opletten :) )

ben er net achter dat het hiermee wel gaat

code:
1
2
3
4
SELECT *, ABS( TIMEDIFF( track_time, bericht_timestamp )) AS verschil
FROM bericht, track
HAVING verschil IN
(SELECT MIN(ABS(TIMEDIFF(track_time, bericht_timestamp ))) FROM bericht, track)


wellicht iets voordeliger?
Neh, De jouwe was toch voordeliger, thnx!

[ Voor 12% gewijzigd door Lucky_me op 31-07-2007 19:54 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Lucky_me schreef op dinsdag 31 juli 2007 @ 19:49:
wellicht iets voordeliger?
Neh, De jouwe was toch voordeliger, thnx!
Bovendien heeft de jouwe weer een HAVING terwijl je dat soort filtering binnen de where/joins zal moeten hebben :)
Pagina: 1