De rij met de hoogste waarde van een bepaalde kolom selecteren
Ik heb een grote tabel, met circa 33K records, dit zal later nog groeien naar ~4 miljoen. Nu stel ik even een simpel voorbeeldje:
-kolom userid -kolom geld
4 | 5.73
2 | 9.92
483 | 1852.58
853 | 5324.04
Nu wil ik dus zo snel mogelijk de userid 853 eruitpikken. Ik weet dat ik kan doen ORDER BY geld DESC LIMIT 1. Maar ik vroeg me af of dit wel een efficiënte oplossing was (met 4+ mil records). Kan dit niet veel sneller?
Groet
Edit: en dan werkt 't nog niet! Je wil namelijk ook nog steeds de ID hebben van die hoogste gebruiker. En als je wil doen
SELECT id,MAX(geld) FROM xxx dan pakt hij de eerste ID die hij tegenkomt, en niet van de rij die het hoogste is.
Gewijzigd op 03/10/2010 18:51:35 door Paul K
met iets meer fantasie, lukt het je misschien wel.
i guess
nee, max is single.....
FROM iets
WHERE geld = (
SELECT MAX( geld )
FROM iets
LIMIT 0 , 1 );
Weet niet of dit het efficiëntst is, maar het kan wel.
Misschien dat het leuk is als je het even test.
Gewoon de verschillende oplossingen in PHPMyAdmin uitvoeren, en dan de tijden even in een tabelletje zetten.
Toevoeging op 03/10/2010 21:41:37:
Ik heb zelf even snel een test gedaan op een miljoen records.
Met de order by duurde het gemiddeld 0,38 seconden om de maximum op te halen, (er zijn alleen meerdere met de hoogste waarde en je krijgt er maar 1)
En met de subquery in de WHERE duurde het gemiddeld 0,29 seconden.
Misschien heeft er iemand nog andere ideeën.
Nico Kaag op 03/10/2010 21:29:36:
SELECT *
FROM iets
WHERE geld = (
SELECT MAX( geld )
FROM iets
LIMIT 0 , 1 );
Weet niet of dit het efficiëntst is, maar het kan wel.
Misschien dat het leuk is als je het even test.
Gewoon de verschillende oplossingen in PHPMyAdmin uitvoeren, en dan de tijden even in een tabelletje zetten.
Toevoeging op 03/10/2010 21:41:37:
Ik heb zelf even snel een test gedaan op een miljoen records.
Met de order by duurde het gemiddeld 0,38 seconden om de maximum op te halen, (er zijn alleen meerdere met de hoogste waarde en je krijgt er maar 1)
En met de subquery in de WHERE duurde het gemiddeld 0,29 seconden.
Misschien heeft er iemand nog andere ideeën.
FROM iets
WHERE geld = (
SELECT MAX( geld )
FROM iets
LIMIT 0 , 1 );
Weet niet of dit het efficiëntst is, maar het kan wel.
Misschien dat het leuk is als je het even test.
Gewoon de verschillende oplossingen in PHPMyAdmin uitvoeren, en dan de tijden even in een tabelletje zetten.
Toevoeging op 03/10/2010 21:41:37:
Ik heb zelf even snel een test gedaan op een miljoen records.
Met de order by duurde het gemiddeld 0,38 seconden om de maximum op te halen, (er zijn alleen meerdere met de hoogste waarde en je krijgt er maar 1)
En met de subquery in de WHERE duurde het gemiddeld 0,29 seconden.
Misschien heeft er iemand nog andere ideeën.
Zulke dingen als met max werken zijn wel voorbeelden van subqueries op scholen... :-)
(Geen idee waar dit topic over gaat, maar gewoon weer lekker aangeven dat je nog wel iets leert op een school.)
En jouw query ka nog steeds meerdere resultaten opleven en de LIMIT in de subquery is overbodig want
SELECT max(geld) mgeld
FROM iets
zal in principe maar 1 resultaat teruggeven namenlijk het hoogste geldbedrag
Configureer eerst mysql zodanig dat het werkt volgens de Standaard SQL normen, dat voorkomt al een hoop ellende.
Gewijzigd op 03/10/2010 21:44:23 door Noppes Homeland
En die LIMIT is inderdaad nutteloos, maar dat zijn van die dingen die er bij mij stiekem ingeslopen zijn, omdat altijd als extra erin te gooien.
En wat is er mis met PHPMyAdmin, is het tegenwoordig van Amstel en daarom "PHPOurAdmin"?
Ik zelf zie niks verkeerds aan PHPOurAdmin, het is een makkelijke tool om snel een database up te loaden, en zo af en toe een query te testen.
Misschien dat ik iets mis, maar dan laat ik mij graag even bijspijkeren.