Sorteren van een sql opdracht

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sietsko Bos

Sietsko Bos

13/06/2018 15:00:32
Quote Anchor link
Hallo,

Ik wil graag uit de database de laatste 30 rijen ophalen.
Maar die moet dan gesorteerd worden op : leerling, datum ASC

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
sql = "SELECT * FROM database WHERE user = '".$_SESSION['user']."' AND klaar = '1' ORDER BY leerling, datum DESC LIMIT 0,30";
?>


Wat doe ik fout?
Gewijzigd op 13/06/2018 15:03:00 door Sietsko Bos
 
PHP hulp

PHP hulp

28/03/2024 11:35:40
 
Thomas van den Heuvel

Thomas van den Heuvel

13/06/2018 15:07:34
Quote Anchor link
Heb je een auto-increment veld in de database (dit is trouwens niet echt een fantastische naam) tabel? Dan is dit simpelweg een kwestie van deze kolom toevoegen:

ORDER BY id DESC, leerling, datum

ASC is meestal de default, dus die kun je eventueel weglaten, of je doet het explicieter:

ORDER BY id DESC, leerling ASC, datum ASC

Dat zorgt ervoor dat er eerst (aflopend) op id wordt gesorteerd, wat ervoor zorgt dat je de laatste 30 records kunt selecteren. Dan oplopend op leerling (wat dit ook moge betekenen? een naam? een leerlingnummer?) en tot slot op datum.

EDIT, of als het argument de datum is: zet de datum vooraan, zodat hier éérst aflopend op wordt gesorteerd.
Gewijzigd op 13/06/2018 15:08:54 door Thomas van den Heuvel
 
Rob Doemaarwat

Rob Doemaarwat

13/06/2018 15:08:55
Quote Anchor link
Laatste 30 =
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
sql = "
  SELECT * FROM database
  WHERE user = '".$_SESSION['user']."'
    AND klaar = '1'
  ORDER BY datum DESC
  LIMIT 0,30";

Dat dan weer sorteren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
  SELECT * FROM (
    SELECT * FROM database
    WHERE user = '".$_SESSION['user']."'
      AND klaar = '1'
    ORDER BY datum DESC
    LIMIT 0,30
  ) x
  ORDER BY leerling, datum ASC";

Die "x" staat er omdat elke "afgeleide tabel" een alias moet hebben.
 
- Ariën  -
Beheerder

- Ariën -

13/06/2018 15:12:34
Quote Anchor link
Een tabel is geen database, maar een onderdeel van een database. Zie het hier als een entiteit van iets.
In jouw geval haal je dus personen op, dus zou users, participants of members een betere naam voor de tabel zijn. Het ligt ook een beetje aan wat voor applicatie je maakt, en wat voor personen je opslaat. Als deze onder te verdelen zijn in twee of meerdere soorten (gebruikers, beheerder) dan is users een pakkende naam die beide partijen dekt.
Gewijzigd op 13/06/2018 15:12:45 door - Ariën -
 
Sietsko Bos

Sietsko Bos

13/06/2018 16:27:47
Quote Anchor link
@Rob Doemaarwat,

Hele duidelijke uitleg voor mij.
Dank je hiervoor.

@- Ariën -,

Voor wat betreft de gebruikte namen, die had ik even wat aangepast om hier neer te zetten.
 
Thomas van den Heuvel

Thomas van den Heuvel

13/06/2018 17:12:27
Quote Anchor link
@Rob, kan dat sorteren niet rechtstreeks door meer argumenten toe te voegen aan de ORDER BY? Waarom is die "afgeleide tabel" nodig?
 
Rob Doemaarwat

Rob Doemaarwat

13/06/2018 17:36:21
Quote Anchor link
Het idee is nu dat je datum technisch de laatste 30 pakt, maar daarna deze hele set van 30 sorteert op `leerling` (geen idee waarom; en dan nogmaals `datum`).

Dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
ORDER BY datum DESC, leerling, datum ASC
LIMIT 0,30
gaat niet werken.

Stel dat de laatste entries allemaal op een opvolgende dag in juni zijn gemaakt (dus 1 juni, 2 juni, enz - t/m 30 juni). Door de eerste sortering staan dan de records op datum volgorde (30 juni, 29 juni, ... 1 juni). Dan heeft het daarna geen zin meer om op leerling (en al helemaal niet nogmaals op datum) te sorteren, omdat die eerste sorting de boel al helemaal vast heeft gelegd. Het resultaat is dan niet zoals gewenst.

Als het anders/beter kan hoor ik het graag. Dit is zoals ik het zou doen.

Alhoewel ik het eigenlijk misschien anders zou doen: Ik zou alleen de eerste query door de database laten doen (de laatste 30 bepalen; er ook vanuit gaande dat er een index op de `datum` zit), en de sortering binnen die set van (slechts) 30 stuks gewoon even in PHP doen. Door die "afgeleide tabel" gaat MySQL voor die laatste sortering waarschijnlijk met temporary table + filesort lopen hannesen, en dat is een beetje jammer als het om slechts 30 stuks gaat. Door dit zelf te doen kan MySQL je gewoon een direct antwoord geven op basis van de index (= geen gehannes).
 
Thomas van den Heuvel

Thomas van den Heuvel

13/06/2018 19:48:27
Quote Anchor link
Je hebt gelijk, zit vandaag in een dipje denk ik :].

Het is wss wel handig als de topicstarter wat opheldering geeft hoe de tabel er precies uitziet, en wat voor betekenis de kolommen hebben. Dat helpt ons allemaal om een makkelijke(re) oplossing te verzinnen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.