[MySQL] row met hoogste id opvragen?

Pagina: 1
Acties:
  • 245 views sinds 30-01-2008
  • Reageer

  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
ik wil graag de row met het hoogste id hebben in 1 query maar het lukt me niet:
code:
1
SELECT max(id) AS maxid FROM work WHERE id=maxid GROUP BY id;

geeft:
MySQL said: Unknown column 'maxid' in 'where clause'
dat is raar want als je doet:
code:
1
select max(id) AS maxid from work;

dan krijg je netjes column 'maxid' met waarde '24' terug (en dat is dus de hoogste id)


dit geeft wel resultaat in Postgresql maar geeft helaas ook alle rows terug:
code:
1
SELECT id FROM work GROUP BY id HAVING max(id) = id;

iemand een enig id waarom die mysql query niet wil??

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • irondog
  • Registratie: Januari 2001
  • Laatst online: 11-05-2025

irondog

alle dingen moeten onzin zijn

de php functie mysql_insert_id(); geeft het id van de AUTO_INCREMENT kolom van de laatst toegevoegde rij.

[P5B deluxe] [Core2Duo 6300] [2 X 1GB DDR2] [GF FX7300] [320 GB WD] [Gentoo] [VISTA]


  • Terranca
  • Registratie: April 2000
  • Laatst online: 02-09 22:35
Just a thought, maar probeer dit s:
code:
1
SELECT max(id) AS maxid FROM work WHERE id=max(id) GROUP BY id;

Verwijderd

code:
1
2
3
4
SELECT *
FROM work
ORDER BY id
LIMIT 1

  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
Op woensdag 26 juni 2002 19:54 schreef Terranca het volgende:
Just a thought, maar probeer dit s:
code:
1
SELECT max(id) AS maxid FROM work WHERE id=max(id) GROUP BY id;
nope

offtopic,
het viel me op dat die postgres query van hier boven een error in phpmyadmin geeft maar op de cmdline wel gewoon werkt maar ook helaas alle rows terug geeft

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
Op woensdag 26 juni 2002 19:56 schreef Cheatah het volgende:
code:
1
2
3
4
SELECT *
FROM work
ORDER BY id
LIMIT 1
dat werkt idd,
hoewel dan moettie wel zo:
SELECT * from work order by id DESC limit 1;

het is een manier maar ik vraag me toch af waarom mijn syntax fout is.

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • charlie
  • Registratie: Oktober 2000
  • Laatst online: 07-03 11:08

charlie

?*?

Op woensdag 26 juni 2002 19:56 schreef Cheatah het volgende:
code:
1
2
3
4
SELECT *
FROM work
ORDER BY id
LIMIT 1
Als hij alleen het id nodig heeft lijkt
SELECT id FROM work ORDER BY id DESC LIMIT 1
nog iets beter op de oplossing.
(edit DESC vergeten)

  • Terranca
  • Registratie: April 2000
  • Laatst online: 02-09 22:35
code:
1
select max(id) as maxid from work

Deze werkt hier ook, maar bovenstaande is evenwel goed. Verschil in performance moet je niet aan mij vragen, maar zal wel minimaal zijn :) Dit staat alleen wat netter ;)

Verwijderd

Wat je ook kan doen is een query maken van alle id's (gesorteerd) en vervolgens met een while loop het te doorlopen waarna je de id telkens in dezelfde variabele opslaat. Als het goed is heeft die variabele aan het einde van de rit dan de waarde die je wilt hebben.

Het is natuurlijk wel omslachtig, maar als max() niet werkt, dan is dit een aardige workaround.

  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 04-09 15:46
WHERE id=maxid is zowieso fout, MySQL pikt het niet dat je een column aanwijst die jij gebruikt als alias...

dan zou het echt MAX(id) moeten zijn

SELECT max(id) AS maxid FROM work WHERE id=maxid GROUP BY id;

alleen wat heeft die WHERE clause voor zin? ook zonder die clause en die GROUP levert het je wel het hoogste ID op, dus beetje zinloos IMHO

en die opmerking van mysql_insert_id() is ook redelijk loos...ik ga er niet van uit dat hij eerst een insert doet alvorens resultaat op te halen :P

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


  • Terranca
  • Registratie: April 2000
  • Laatst online: 02-09 22:35
Op woensdag 26 juni 2002 20:02 schreef BaseLine het volgende:
Wat je ook kan doen is een query maken van alle id's (gesorteerd) en vervolgens met een while loop het te doorlopen waarna je de id telkens in dezelfde variabele opslaat. Als het goed is heeft die variabele aan het einde van de rit dan de waarde die je wilt hebben.

Het is natuurlijk wel omslachtig, maar als max() niet werkt, dan is dit een aardige workaround.
Zéér omslachtig, en denk dat max() het best doet, mits je het goed gebruikt ;)

  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 04-09 15:46
Op woensdag 26 juni 2002 20:02 schreef BaseLine het volgende:
Wat je ook kan doen is een query maken van alle id's (gesorteerd) en vervolgens met een while loop het te doorlopen waarna je de id telkens in dezelfde variabele opslaat. Als het goed is heeft die variabele aan het einde van de rit dan de waarde die je wilt hebben.

Het is natuurlijk wel omslachtig, maar als max() niet werkt, dan is dit een aardige workaround.
OMG! dat is pas een zinloze oplossing, je zou zeker een table hebben met 2 miljoen records, dan ga jij zeker eerst fijn je zooi in een array opslaan, die sorteren en dan de laatste record eruit halen? praten we over omslachtig |:(

MAX() werkt wel, mits je het goed gebruikt...

wat jij wil is dit:

SELECT id FROM work ORDER BY id DESC LIMIT 0,1

simpel :)

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


Verwijderd

Hij wil heel de row hebben, dus op zijn manier zou het met een geneste query moeten:
code:
1
2
3
4
5
6
7
SELECT *
FROM work
WHERE ID =
(
  SELECT MAX(id)
  FROM work
);

Verwijderd

OMG! dat is pas een zinloze oplossing
Dat zeg ik: een workaround :P

  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 04-09 15:46
Op woensdag 26 juni 2002 20:02 schreef Charlie23 het volgende:

[..]

Als hij alleen het id nodig heeft lijkt
SELECT id FROM work ORDER BY id DESC LIMIT 1
nog iets beter op de oplossing.
(edit DESC vergeten)
nou ik denk dat dit in performance gezien minder goed werkt...

op deze manier haalt SQL de hele resultset op, om die vervolgens te sorteren op ID aflopend en dan het laatste resultaat te retourneren

die MAX(), als je een index op die column hebt staan, hoeft niet de hele tabel te doorzoeken...dus veel efficienter

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 04-09 15:46
Op woensdag 26 juni 2002 20:07 schreef BaseLine het volgende:

[..]

Dat zeg ik: een workaround :P
[offtopic] praat die jongen nou geen bullshit aan, daar leert ie niet van ;)

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
Op woensdag 26 juni 2002 20:04 schreef SilentThunder het volgende:
WHERE id=maxid is zowieso fout, MySQL pikt het niet dat je een column aanwijst die jij gebruikt als alias...

dan zou het echt MAX(id) moeten zijn

SELECT max(id) AS maxid FROM work WHERE id=maxid GROUP BY id;

alleen wat heeft die WHERE clause voor zin? ook zonder die clause en die GROUP levert het je wel het hoogste ID op, dus beetje zinloos IMHO

en die opmerking van mysql_insert_id() is ook redelijk loos...ik ga er niet van uit dat hij eerst een insert doet alvorens resultaat op te halen :P
die group by clause moet je verplicht altijd gebruiken als je MAX(), count() etc gebruikt

die where clause moet je gebruiken anders krijg je alsnog alle rows terug...

dat van die alias wist ik idd niet

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 04-09 15:46
Op woensdag 26 juni 2002 20:10 schreef GiLuX het volgende:

[..]

die group by clause moet je verplicht altijd gebruiken als je MAX(), count() etc gebruikt

die where clause moet je gebruiken anders krijg je alsnog alle rows terug...

dat van die alias wist ik idd niet
nee dat hoeft niet verplicht...

kheb MySQL Front open hier en deze query:

SELECT MAX(id) FROM tutorial_stats

levert mij netjes 5007 op, dus zeg nou niet dat dat niet werkt :P

zo'n GROUP BY of HAVING statement is alleen nodig als je je results wil opdelen per kolom zeg maar, dus als je in mijn tabel als voorbeeld, zou willen zien welke tutorials een bepaald aantal views hebben.

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
Op woensdag 26 juni 2002 20:08 schreef SilentThunder het volgende:

[..]

nou ik denk dat dit in performance gezien minder goed werkt...

op deze manier haalt SQL de hele resultset op, om die vervolgens te sorteren op ID aflopend en dan het laatste resultaat te retourneren

die MAX(), als je een index op die column hebt staan, hoeft niet de hele tabel te doorzoeken...dus veel efficienter
interesting...

maar wat is nou de goede oplossing met MAX() erin?
:)

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 04-09 15:46
Op woensdag 26 juni 2002 20:13 schreef GiLuX het volgende:

[..]

interesting...

maar wat is nou de goede oplossing met MAX() erin?
:)
SELECT MAX(id) FROM work

dat moet gewoon werken :P

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
Op woensdag 26 juni 2002 20:12 schreef SilentThunder het volgende:

[..]

nee dat hoeft niet verplicht...

kheb MySQL Front open hier en deze query:

SELECT MAX(id) FROM tutorial_stats

levert mij netjes 5007 op, dus zeg nou niet dat dat niet werkt :P

zo'n GROUP BY of HAVING statement is alleen nodig als je je results wil opdelen per kolom zeg maar, dus als je in mijn tabel als voorbeeld, zou willen zien welke tutorials een bepaald aantal views hebben.
woops, sorry :P

ik zit stiekum dit te typen:
SELECT max(id),work_description AS maxid FROM work;

en dan krijg ik:

ERROR 1140: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 04-09 15:46
Op woensdag 26 juni 2002 20:15 schreef GiLuX het volgende:

[..]

woops, sorry :P

ik zit stiekum dit te typen:
SELECT max(id),work_description AS maxid FROM work;

en dan krijg ik:

ERROR 1140: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause
mjah haha dan klopt het ook wel dat het niet goed is :P

op het moment dat je d'r meerdere columns in gooit dan moet je die andere functies gebruiken ja :+

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
Op woensdag 26 juni 2002 20:14 schreef SilentThunder het volgende:

[..]

SELECT MAX(id) FROM work

dat moet gewoon werken :P
zie post hierboven
sorrysorrysorry

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 04-09 15:46
Op woensdag 26 juni 2002 20:16 schreef GiLuX het volgende:

[..]

zie post hierboven
sorrysorrysorry
np :)

hehe het werkt dus

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
Op woensdag 26 juni 2002 20:17 schreef SilentThunder het volgende:

[..]

np :)

hehe het werkt dus
ja dat wel maar nog steeds niet op deze manier:
SELECT max(id) AS maxid FROM work WHERE id=maxid GROUP BY id;

of deze:
SELECT max(id),work_description AS maxid FROM work;

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 04-09 15:46
Op woensdag 26 juni 2002 20:19 schreef GiLuX het volgende:

[..]

ja dat wel maar nog steeds niet op deze manier:
SELECT max(id) AS maxid FROM work WHERE id=maxid GROUP BY id;

of deze:
SELECT max(id),work_description AS maxid FROM work;
nee maar dat is toch ook onzin? lijkt mij dan...

als je alleen het hoogste id wilt weten is die oplossing toch afdoende?

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
Op woensdag 26 juni 2002 20:20 schreef SilentThunder het volgende:

[..]

nee maar dat is toch ook onzin? lijkt mij dan...

als je alleen het hoogste id wilt weten is die oplossing toch afdoende?
weer excuses dan..

wat ik wil is een boel velden lezen uit de row met de hoogste id in 1 query.

dus niet eerst de hoogste id ophalen en dan in een nieuwe query die row uitlezen,
dit wil ik dus in een query bereiken...
vandaar..

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 04-09 15:46
Op woensdag 26 juni 2002 20:23 schreef GiLuX het volgende:

[..]

weer excuses dan..

wat ik wil is een boel velden lezen uit de row met de hoogste id in 1 query.

dus niet eerst de hoogste id ophalen en dan in een nieuwe query die row uitlezen,
dit wil ik dus in een query bereiken...
vandaar..
mjah excuses nie nodig :P

ohh op zo'n manier...hehe ik snapte ff nie wat je bedoelde

sja ff uitzoeken hoe dat dan werkt :P

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 04-09 15:46
makkelijkste oplossing iig is:

SELECT * FROM work ORDER BY id DESC LIMIT 0,1

maar of dat de meest efficiente is...kijk als dat ding nou 100 records heeft is dat te verwaarlozen :)

[edit] Als MySQL nou es subqueries ondersteunde...|:(

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
Op woensdag 26 juni 2002 20:31 schreef SilentThunder het volgende:
makkelijkste oplossing iig is:

SELECT * FROM work ORDER BY id DESC LIMIT 0,1

maar of dat de meest efficiente is...kijk als dat ding nou 100 records heeft is dat te verwaarlozen :)

[edit] Als MySQL nou es subqueries ondersteunde...|:(
ah, die was nog niet eerder voorbij gekomen :P

maar het kan dus niet met MAX() is de algemene conclusie?

tja subqueries zou mooi zijn..

als je de innodb versie gebruikt kan het dan wel?

maarja, innodb is al een stuk mooier maar dan kan je net zo goed met postgres aan de gang gaan, is veel stoerder.

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


Verwijderd

deze werkt ook... maarja, er is volgens mij nog veel aan te optimizen!
code:
1
2
3
4
5
6
7
SELECT     id, 
         username, 
         MAX(id) AS maxid 
FROM     table 
GROUP BY   id 
HAVING     id = maxid 
LIMIT   1

Die LIMIT moet er op de 1 of andere manier uit kunnen denkik...

[edit]
Sorry, deze werkte ook niet, moet je hem nog aflopend sorteren en dan is het normale natuurlijk sneller...
[/edit

  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 04-09 15:46
Op woensdag 26 juni 2002 23:26 schreef zellufs het volgende:
deze werkt ook... maarja, er is volgens mij nog veel aan te optimizen!
code:
1
2
3
4
5
6
7
SELECT     id, 
         username, 
         MAX(id) AS maxid 
FROM     table 
GROUP BY   id 
HAVING     id = maxid 
LIMIT   1

Die LIMIT moet er op de 1 of andere manier uit kunnen denkik...

[edit]
Sorry, deze werkte ook niet, moet je hem nog aflopend sorteren en dan is het normale natuurlijk sneller...
[/edit
met subqueries was het een stuk makkelijker |:(

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


Verwijderd

stelletje prutsers

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 03-09 15:18

Crazy D

I think we should take a look.

Op donderdag 27 juni 2002 09:17 schreef sjako het volgende:
stelletje prutsers
Bedankt voor uw constructieve bijdrage :(

Exact expert nodig?


Verwijderd

Op donderdag 27 juni 2002 09:17 schreef sjako het volgende:
stelletje prutsers
NU een betere oplossing!! :9

Verwijderd

Op donderdag 27 juni 2002 09:48 schreef Crazy_D het volgende:

Bedankt voor uw constructieve bijdrage :(
Op donderdag 27 juni 2002 10:02 schreef zellufs het volgende:

[..]

NU een betere oplossing!! :9
:+

ik wil 250 km/uur rijden met mijn fiets.
dat kan niet.
ja, maar als ik nu grotere banden neem.
lukt niet.
dan start ik de motor wel.
die zit niet op een fiets.

wat ik wil zeggen is dat je wel van alles kunt willen, maar je moet leren leven met beperkingen.

MySQL ondersteunt geen sub-queries dus daar hoef je niet over te beginnen.

Je moet wel weten wat je aan het doen bent : zorg dat de syntax goed is (group by functies).

performance.... tsja.
als je het per se in 1 query wilt hebben (want?) dan moet je misschien voor een minder gunstige (?) oplossing kiezen.

zie post Cheatah (!) : hoeveel langzamer gaat dat dan volgens jullie? (order by / max() --> index)

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

Op donderdag 27 juni 2002 09:17 schreef sjako het volgende:
stelletje prutsers
laat dit voortaan achterwege svp

Doet iets met Cloud (MS/IBM)

Pagina: 1