[mysql] max halen van een beperkt aantal records

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

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
met
code:
1
$sql1 = "SELECT max(aantal) FROM archi_monthly";

Haal ik de hoogste integer van de kolom aantal eruit. Echter ik wil dat hij slechts kijkt naar de eerste 5 records:
code:
1
$sql2 = "SELECT max(aantal) FROM archi_monthly ORDER by zoek ASC LIMIT 0,5";

dit geeft nog steeds het zelfde antwoord als de $sql1, een fout antwoord. Het lijkt alsof hij niet eens kijkt naar dat limit 0,5.

mis ik iets in de reference bijbel van mysql?

hier zou een slimme opmerking kunnen staan
maar die staat er niet


  • T-MOB
  • Registratie: Maart 2001
  • Nu online
De LIMIT beperkt het aantal teruggeven rijen. Als je om een MAX vraagt zonder GROUP BY zul je altijd maar 1 rij terugkrijgen. De LIMIT haalt dus terecht niets uit.
Waar je wel op zoek naar bent is een WHERE clausule die aangeeft dat er alleen naar de laatste 5 records gekeken moet worden. Of dat kan en hoe dat kan hangt af van de gegevens die in `zoek` staan.
Als je de mogelijkheid tot subqueries hebt zou zoiets kunnen werken:
SQL:
1
2
3
4
5
6
7
SELECT max(aantal) 
FROM archi_monthly 
WHERE `zoek` > ( 
    SELECT `zoek` 
    FROM archi_monthly 
    ORDER by zoek ASC 
    LIMIT 5,1);

Regeren is vooruitschuiven


  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
ik gebruik mysql, en ik geloof dat sub queries niet echt supported zijn door mysql.
het veld zoek is een combinatie van het jaar getal en het maandgetal: 0601 voor januari 2006 etc etc

hier zou een slimme opmerking kunnen staan
maar die staat er niet


  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 16-02 12:21

edeboeck

mie noow noooothing ...

dacht dat subquery's wel ondersteund werden vanaf MySQL 5.x, maar kan hier de bal volledig misslaan

Als subquery's niet ondersteund worden, kan je nog altijd met een tussenstap werken (soort ei van Columbus zeg maar :*) ):
1) sla die eerste 5 records op in een tijdelijke tabel
2) haal max uit die tabel

Verwijderd

Ben je er niet al als je een WHERE toevoegt? Bijv.


code:
1
$sql2 = "SELECT max(aantal) FROM archi_monthly WHERE id < '9999' ORDER BY id ASC LIMIT 0,5";


Want dan werkt de LIMIT wel, neem ik zo aan.

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
de tabel heeft geen id, hij ziet er zo uit:
code:
1
2
3
4
5
archi_monthly
+ zoek + jaar + maand + hits +
+ 0602 +  06  +  02   +  162 +
+ 0603 +  06  +  03   +  57  +
+ 0601 +  06  +  01   +  170 +


met het veld zoek moet ik dus inperken dus opzich zou dat moetenlukken.. ga ik thuis eens eve proberen...
dom dat ik er zosnel overheen gekeken heb.. kan natuurlijk ook zon operator :)

[ Voor 14% gewijzigd door hobbeldebobbel op 14-03-2006 12:45 ]

hier zou een slimme opmerking kunnen staan
maar die staat er niet


  • Blackbird-ce
  • Registratie: September 2005
  • Laatst online: 16:39
Verwijderd schreef op dinsdag 14 maart 2006 @ 12:27:
Ben je er niet al als je een WHERE toevoegt? Bijv.


code:
1
$sql2 = "SELECT max(aantal) FROM archi_monthly WHERE id < '9999' ORDER BY id ASC LIMIT 0,5";


Want dan werkt de LIMIT wel, neem ik zo aan.
nee, dan krijg je als eerste resultset 9998 rijen (uitgaande dat er meer dan 9999 records zijn, met oplopende id's). De max(aantal) geeft er 1 terug: het maximum. De limit 0,5 is altijd groter dan die ene regel die je terug krijgt... De limit gebeurt achteraf, niet vooraf.

waarom niet gewoon:
code:
1
$sql3 = "SELECT aantal FROM archi_monthly WHERE zoek IN (SELECT zoek FROM archi_monthly LIMIT 0,5)";


De subquery geeft de 5 eerste records, de buitenste query het hoogste daarvan.
Subqueries werken wél in mysql, alleen pas sinds de laatste paar versies.

[ Voor 4% gewijzigd door Blackbird-ce op 14-03-2006 12:48 . Reden: id = zoek :) ]


  • T-MOB
  • Registratie: Maart 2001
  • Nu online
Uit de tabel structuur leidt ik af dat het om jaren / maanden gaat. Daar wordt het nogal wat makkelijker van omdat je altijd weet wat de bovenste 5 waarden zijn, namelijk de laatste 5 maanden. Je kunt dus gewoon in PHP of SQL bepalen wat de grenswaarde is voor het `zoek` veld en die waarde opnemen in je WHERE clausule.

De structuur van de tabel is overigens een beetje vreemd. Waarom sla je de maand en het jaar dubbel op?

Regeren is vooruitschuiven


  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
dat dubbele is erin geslopen naarmate de code vorderde :) zie ook mijn andere topic, daar is de code onleesbaar omdat er steeds dingen bij kwamen.
het veld maand en jaar word ingevuld door een counter.php die die variabelen ook ergens anders gebruikte.. waarom die dan niet hergebruiken :)
totdat ik een zoekveld moest hebben... dus vandaar... eigenlijk overbodig dus... had inderdaad ook met een substr kunnen werken... maarja

die where clausule had ik inderdaad gewoon overheen gekeken.. dom dom dom

hier zou een slimme opmerking kunnen staan
maar die staat er niet

Pagina: 1