[SQL] max()

Pagina: 1
Acties:

  • Juup
  • Registratie: Februari 2000
  • Niet online
Ik heb de volgende sql query op MySQl losgelaten:
code:
1
select vid, nid, max(date) as date from nodeversions where nid="One" group by nid;

beetje aangepast om korter te maken

Nu krijg ik één row terug met waarden uit verschillende rows! Ik krijg dus een row terug die is samengesteld uit waarden van verschillende rows. :?
iets specifieker: de vid waarde die ik terug krijg bestaat niet in combinatie met die nid en date.

Hoort dit zo of doe ik iets fout?

[ Voor 7% gewijzigd door Juup op 27-07-2004 15:36 ]

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Jaaap:
Ik heb de volgende sql query op MySQl losgelaten:
code:
1
select vid, nid, max(date) as date from nodeversions where nid="One" group by nid;

beetje aangepast om korter te maken

Nu krijg ik één row terug met waarden uit verschillende rows! Ik krijg dus een row terug die is samengesteld uit waarden van verschillende rows. :?
iets specifieker: de vid waarde die ik terug krijg bestaat niet in combinatie met die nid en date.

Hoort dit zo of doe ik iets fout?
Strict genomen zou MySQL dit niet toe moeten laten, maar jij doet 't fout ;) Probeer voor de gein de query eens te analyseren en voor jezelf te bepalen wat een dbms in vredesnaam met die 'vid' aan zou moeten bij zo'n query :)

Zet de vid er ook bij in je group by clause en je bent al een stuk verder.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Boss
  • Registratie: September 1999
  • Laatst online: 13:50

Boss

+1 Overgewaardeerd

Moet je niet ook groeperen op date dan?

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • djiedjee
  • Registratie: December 2003
  • Laatst online: 16:28
Juup schreef op 27 juli 2004 @ 15:35:
Ik heb de volgende sql query op MySQl losgelaten:
code:
1
select vid, nid, max(date) as date from nodeversions where nid="One" group by nid;

beetje aangepast om korter te maken

Nu krijg ik één row terug met waarden uit verschillende rows! Ik krijg dus een row terug die is samengesteld uit waarden van verschillende rows. :?
iets specifieker: de vid waarde die ik terug krijg bestaat niet in combinatie met die nid en date.

Hoort dit zo of doe ik iets fout?
Moet dit niet zijn:
code:
1
select vid, max(date) as date from nodeversions where nid="One" group by vid;

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09:13

Janoz

Moderator Devschuur®

!litemod

Dat de query wordt geaccepteerd heeft meer te maken met de laksheid van mysql, want hij is fout. Jij wil waarschijnlijk de vid met de grootste date per nid achterhalen. Hiervoor zul je HAVING moeten gebruiken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Boegel
  • Registratie: Maart 2002
  • Laatst online: 07-01-2018

Boegel

just boegel

Juup schreef op 27 juli 2004 @ 15:35:
Ik heb de volgende sql query op MySQl losgelaten:
code:
1
2
select vid, nid, max(date) as date from nodeversions 
where nid="One" group by nid;

beetje aangepast om korter te maken

Nu krijg ik één row terug met waarden uit verschillende rows! Ik krijg dus een row terug die is samengesteld uit waarden van verschillende rows. :?
iets specifieker: de vid waarde die ik terug krijg bestaat niet in combinatie met die nid en date.

Hoort dit zo of doe ik iets fout?
Je selecteert alle tuples met nid="One", en dan groepeer je op nid... Totaal nutteloos eh :)
Volgens mij doet MySQL iets raars omdat ie alles in 1 zak steekt, en dan de maximum datum eruithaalt, samen met een willekeurige (eerste?) vid...

Ik zou het zo doen:

code:
1
select vid, nid, max(date) as date from nodeversions where nid="One";


De group by is dus niet nodig, dit geeft je de grootste datum voor alle rijen met nid="One"

of is dat de bedoeling niet ? erg duidelijk ben je niet...

[ Voor 3% gewijzigd door Boegel op 27-07-2004 15:42 ]

boegel - er zijn maar 10 soorten mensen in de wereld: diegene die het binaire stelsel kennen en diegene die het niet kennen


  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Juup schreef op 27 juli 2004 @ 15:35:
Ik heb de volgende sql query op MySQl losgelaten:
code:
1
select vid, nid, max(date) as date from nodeversions where nid="One" group by nid;

beetje aangepast om korter te maken

Nu krijg ik één row terug met waarden uit verschillende
rows!
De manual zegt letterlijk: You will get unpredictable results.

Slotje?

  • Juup
  • Registratie: Februari 2000
  • Niet online
Ok dank allen. Ik zal die hanving() eens proberen. Die where nid="One" zit er normaal niet in hoor.

Edit:
having() wordt nix. Ik wil eigenlijk dit:
code:
1
select nid, max(date) as date from nodeversions group by nid;

Maar nu wil ik graag ook de bijbehorende vid weten.

[ Voor 62% gewijzigd door Juup op 27-07-2004 15:48 ]

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • Boegel
  • Registratie: Maart 2002
  • Laatst online: 07-01-2018

Boegel

just boegel

Juup schreef op 27 juli 2004 @ 15:44:
Ok dank allen. Ik zal die hanving() eens proberen. Die where nid="One" zit er normaal niet in hoor.

Edit:
having() wordt nix. Ik wil eigenlijk dit:
code:
1
select nid, max(date) as date from nodeversions group by nid;

Maar nu wil ik graag ook de bijbehorende vid weten.
code:
1
 select nid,vid,date from nodeversions group by nid having date = max(date)


zo dan?

[ Voor 3% gewijzigd door Boegel op 27-07-2004 15:52 ]

boegel - er zijn maar 10 soorten mensen in de wereld: diegene die het binaire stelsel kennen en diegene die het niet kennen


  • Vaudtje
  • Registratie: April 2002
  • Niet online
of zo?
code:
1
select vid, nid, max(date) as date from nodeversions where nid="One" group by nid,vid;

hangt er dus maar net vanaf wat je wil. Maar je kunt dus in je group by meerdere kolommen opgeven :)
Boegel's suggestie kan dus meerdere rijen teruggeven, als nid+vid samen de pk is ipv alleen nid

[ Voor 21% gewijzigd door Vaudtje op 27-07-2004 15:57 ]

In deeze zin staan drie fauten


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

drm schreef op 27 juli 2004 @ 15:38:
[...]

Strict genomen zou MySQL dit niet toe moeten laten, maar jij doet 't fout ;) Probeer voor de gein de query eens te analyseren en voor jezelf te bepalen wat een dbms in vredesnaam met die 'vid' aan zou moeten bij zo'n query :)
Wat ik 2 uur geleden in [rml]curry684 in "[ SQL] 1002 EDT NGC Not a GROUP BY colum"[/rml] ook al heb uitgelegd 8)7 Is dat nu echt zo moeilijk te begrijpen dat we dit zo vaak terug zien?

Professionele website nodig?


Verwijderd

Is 't geen idee daar een FAQ van te maken, of een apart topic?

Dan kunnen we er meteen in kwijt dat je getallen ook in kolommen van het type INT (of FLOAT) moet opslaan, en niet in VARCHARs, omdat je er anders niks mee kan.

En een topic over "hoe debug je fatsoenlijk"? En als we dan nog een topic maken over hiërarchische structuren in een database, dan scheelt dat meteen de helft van de vragen per dag :).

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 27 juli 2004 @ 16:09:
Is 't geen idee daar een FAQ van te maken, of een apart topic?
P&W FAQ - SQL is toch groot genoeg dacht ik, en linkt direct naar www.sqlcourse2.com die 'group by' en aggregates uitlegt.
En een topic over "hoe debug je fatsoenlijk"? En als we dan nog een topic maken over hiërarchische structuren in een database, dan scheelt dat meteen de helft van de vragen per dag :).
P&W FAQ - Leer **** debuggen!! :Y)

Professionele website nodig?


  • Juup
  • Registratie: Februari 2000
  • Niet online
Okee vergeef me mijn oneindige domheid, maar ik wil het volgende uit 1 MySQL tabel trekken (vid is een unieke key):

Alle vid
waar max(date) per nid

Dat laatste is me met jullie hulp gelukt:
code:
1
select nid, max(date) as date from nodeversions group by nid;

Maar nu wil ik nog de bijbehorende vid zien.

Fout:
code:
1
select vid, nid, max(date) as date from nodeversions group by nid;

Geeft een willekeurige vid terug, wat ik nu ook begrijp.

Fout:
code:
1
select vid, nid, max(date) as date from nodeversions group by nid, vid;

Geeft natuurlijk alle vid's omdat die primary key is.

Ik zal dus iets moeten gaan joinen maar dan op 2 waarden (max(date) en nid). Kan dat?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • llevering
  • Registratie: September 2000
  • Laatst online: 19-05 10:11
code:
1
select vid, nid, max(date) as date from nodeversions group by vid, nid;

  • Juup
  • Registratie: Februari 2000
  • Niet online
llevering schreef op 29 juli 2004 @ 08:55:
code:
1
select vid, nid, max(date) as date from nodeversions group by vid, nid;
Deze retourneert ALLE unieke vid's (m'n hele tabel dus).

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • llevering
  • Registratie: September 2000
  • Laatst online: 19-05 10:11
Uhm jah klopt was geloof ik nog niet al te helder, zie de oplossing zo snel ook niet.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Ga gewoon verder in je vorige topic zolang het over hetzelfde onderwerp gaat :)

* curry684 drukt op merge-knopjes.

Professionele website nodig?


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Probeer dit eens:
code:
1
2
3
4
5
6
7
8
SELECT vid, nid, date 
FROM nodeversions 
WHERE nid 
AND date 
IN ( 
  SELECT nid, max(date) AS DATE 
  FROM nodeversions )
GROUP BY nid

of dit:
code:
1
2
3
4
5
6
7
SELECT vid, nid, date 
FROM nodeversions 
WHERE nid, date 
IN ( 
  SELECT nid, max(date) AS DATE 
  FROM nodeversions)
GROUP BY nid
Weet namelijk niet de juiste manier om op meerdere kollommen te checken bij een IN.

[ Voor 11% gewijzigd door eghie op 29-07-2004 11:19 ]


Verwijderd

Weet niet of dit in MySQL werkt. In Oracle kun je met inline views werken. Dat ziet er als volgt uit:

SELECT v1.vid
FROM nodeversions v1
, ( select nid
, max(date) datum
from nodeversions
group by nid
) v2
WHERE v1.nid = v2.nid
AND v1.date = v2.datum
Pagina: 1