Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.
Strict genomen zou MySQL dit niet toe moeten laten, maar jij doet 't foutJaaap:
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?
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
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.
Moet dit niet zijn: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?
1
| select vid, max(date) as date from nodeversions where nid="One" group by vid; |
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Je selecteert alle tuples met nid="One", en dan groepeer je op nid... Totaal nutteloos ehJuup 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?
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:
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
De manual zegt letterlijk: You will get unpredictable results.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!
Slotje?
Edit:
having() wordt nix. Ik wil eigenlijk dit:
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.
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.
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
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
Wat ik 2 uur geleden in [rml]curry684 in "[ SQL] 1002 EDT NGC Not a GROUP BY colum"[/rml] ook al heb uitgelegddrm schreef op 27 juli 2004 @ 15:38:
[...]
Strict genomen zou MySQL dit niet toe moeten laten, maar jij doet 't foutProbeer 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
Verwijderd
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
P&W FAQ - SQL is toch groot genoeg dacht ik, en linkt direct naar www.sqlcourse2.com die 'group by' en aggregates uitlegt.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 - Leer **** debuggen!!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.
Alle vid
waar max(date) per nid
Dat laatste is me met jullie hulp gelukt:
1
| select nid, max(date) as date from nodeversions group by nid; |
Maar nu wil ik nog de bijbehorende vid zien.
Fout:
1
| select vid, nid, max(date) as date from nodeversions group by nid; |
Geeft een willekeurige vid terug, wat ik nu ook begrijp.
Fout:
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.
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).llevering schreef op 29 juli 2004 @ 08:55:
code:
1 select vid, nid, max(date) as date from nodeversions group by vid, nid;
Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.
* curry684 drukt op merge-knopjes.
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:
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 |
[ Voor 11% gewijzigd door eghie op 29-07-2004 11:19 ]
Verwijderd
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