0%

Stel precieze vragen · oefening

Beslis bij gelijke waarden met extra sorteersleutels

De accuboormachine en klaptafel met zeven dagen staan gelijk. Alleen vragen om loan_days DESC kan niet bepalen welke eerst hoort te komen, dus twee correcte uitvoeringen kunnen die rijen op verschillende posities tonen.

Geef SQLite meer instructies door de huidige ORDER BY-regel te vervangen door deze:

ORDER BY loan_days DESC, name ASC, id ASC;

Druk op Run. De rijen met zeven dagen staan nog steeds boven de rij met drie dagen en hun namen beslissen nu bij de eerste gelijke stand:

TL-100 | Cordless drill | tools | 7
EV-101 | Folding table | events | 7
TL-220 | Step ladder | tools | 3

SQLite leest de sorteersleutels van links naar rechts. Het vergelijkt eerst loan_days, met grotere waarden vooraan. Pas wanneer twee termijnen gelijk zijn, vergelijkt het name, deze keer in oplopende alfabetische volgorde. Als zowel de termijn als de naam gelijk zijn, neemt id ASC de laatste beslissing.

Stel je twee rijen met zeven dagen voor, allebei met de naam Folding table, met ID’s 12 en 90. De eerste sleutel is gelijk, en de tweede ook. SQLite komt bij de derde sleutel en zet ID 12 vóór ID 90. Een latere sleutel draait nooit een beslissing terug die een eerdere sleutel al heeft genomen.

Je hebt id niet aan de resultaatkolommen toegevoegd en dat hoeft ook niet. Een kolom mag helpen het antwoord te ordenen zonder te worden getoond. Het zichtbare resultaat blijft gericht op de code, naam, categorie en termijn.

Waarom komt er een ID na de naam? Een catalogus kan twee verschillende voorwerpen bevatten met dezelfde voor mensen leesbare naam. “Folding table” kan meerdere fysieke tafels beschrijven, terwijl hun expliciete ID’s ze nog steeds onderscheiden. De laatste sleutel geeft elke passende rij één vaste plek, ook wanneer de eerdere waarden gelijk zijn.

Ook de richtingen zijn bewust gekozen. loan_days DESC zet langere termijnen vooraan; name ASC en id ASC zetten kleinere tekst- en ID-waarden vooraan bij een gelijke stand. Als je de volgorde van die sleutels verandert, verandert de vraag. Door ID vóór naam te zetten, zouden de ID’s beslissen bij een gelijke stand voordat de namen aan de beurt komen.

Submit gebruikt gelijke termijnen, herhaalde namen en een door elkaar gehusselde invoegvolgorde. Controleer de volledige lijst na ORDER BY in plaats van alleen de drie zichtbare rijen te beoordelen. Een query kan op deze kleine catalogus stabiel lijken en toch een gelijke stand onbeslist laten.

Je resultaat heeft nu een volledige volgorde. Elke passende rij heeft een voorspelbare positie, omdat er voor elke mogelijke gelijke stand een latere sleutel klaarstaat om te beslissen.

Opdracht

Vervang de sortering op één sleutel in search.sql door loan_days DESC, name ASC, id ASC.

Voer de query uit en stuur hem in nadat je hebt gecontroleerd of de sorteersleutels in die volgorde staan.