Archief - ORDER BY vs LIMIT

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Sick-Boy

Legacy Member
Ik ben een website aan het maken van een voetbalclub en ik had graag resultaten en volgende wedstrijden weergegeven op de voorpagina.
Ik bekijk voor welke wedstrijden al een score werd ingegeven en sorteer ze op datum, de 4 laatste resultaten moeten worden weergegeven.

Nu is het probleem dat ik ofwel de eerste 4 resultaten krijg in de juiste volgorde ofwel de laatste 4 resultaten in omgekeerde volgorde. Ik wil uiteraard dat de datums aansluiten bij de weergave van de volgende wedstrijden.

Subquery werken niet omdat mijn host niet ondersteunt dat LIMIT in een subquery wordt gebruikt.

Any thoughts?

wonko

Legacy Member
waarom draai niet gewoon de volgorde van de resultaten van je query om in je code?

Sick-Boy

Legacy Member
Ik wil graag een oplossing in SQL.

Door arrays om te draaien is het probleem omzeilt, niet opgelost :)

Sick-Boy

Legacy Member
Dat bedoel ik met "ofwel de eerste 4 resultaten krijg in de juiste volgorde ofwel de laatste 4 resultaten in omgekeerde volgorde".

Stel dat ik 5 resultaten heb (1 het oudste en 5 het nieuwste) en ik wil er 4 weergeven dan krijg ik:

ASC: 1, 2, 3,4
DESC: 5,4,3,2

En ik wil, om aan te sluiten bij de wedstrijden die komen, deze volgorde:
2,3,4,5

Ik weet dat je dit kan omzeilen met COUNT() of zoiets, maar ik vraag mij af of er een SQL oplossing bestaat.

metalleke

Legacy Member
Je moet gebruik maken van een join statement. Maak een subquery die gebruik maakt van de limit clause en join deze met de orginele tabel (of welke ge nog nodig hebt).

d-zilla

Legacy Member
bijvoorbeeld LIMIT 5 , 5
dan zal die pas starten op de 5de record

Sick-Boy

Legacy Member
Een limit voor joins, daar heb ik nog nooit van gehoord, misschien snap ik niet goed wat je bedoelt. En een subquery met limit gaat niet omdat mijn mysql versie dat niet ondersteunt.

@d-zilla: en hoe kom ik aan die 5?

metalleke

Legacy Member
Sick-Boy zei:
Een limit voor joins, daar heb ik nog nooit van gehoord, misschien snap ik niet goed wat je bedoelt. En een subquery met limit gaat niet omdat mijn mysql versie dat niet ondersteunt.

@d-zilla: en hoe kom ik aan die 5?

Limit voor joins? Dat staat er toch helemaal niet?

Sick-Boy

Legacy Member
Dan had ik het verkeerd begrepen :)
Zo is het in ieder geval opgelost, bedankt!

wonko

Legacy Member
als ge het zo doet, gaat uw DBA daar niet zo gelukkig mee zijn. SQL is niet gemaakt om dergelijke vragen op te lossen, en je optimizer gaat niet zien wat je precies wenst te doen; je doet twee table scans waar je normaal er maar eentje nodig hebt...

Het is wel degelijk in je code dat je dat normaal moet oplossen.

MiniJeffrey

Legacy Member
zoals wonko zegt, zou ik het idd in de code oplossen:

php:
select de eerste zes entries
gooi de eerste entry weg door fetch_arrey
doe een while(fecth_array) om de vijf andere entries op te vragen

Sick-Boy

Legacy Member
Misschien niet zo'n goed idee voor als het om veel entries gaat.

In php kan ik het oplossen, ik wou gewoon een SQL oplossing vinden.

wonko

Legacy Member
SQL dient daar niet voor, om het antwoord exact te geven hoe jij het wil. Het laat je toe om een relationele DB te ondervragen en een resultset terug te krijgen. Die resultset is niet altijd "klaar voor gebruik".

De manier waarop je het "kan" doen in de voorbeelden gegeven (subselect met een distinct gebruiken in een IN() statement, of een join) is zo ongelooflijk fout dat ik je je C4 zou geven mocht je bij mij werken en dergelijke dingen uithalen.

metalleke

Legacy Member
wonko zei:
SQL dient daar niet voor, om het antwoord exact te geven hoe jij het wil. Het laat je toe om een relationele DB te ondervragen en een resultset terug te krijgen. Die resultset is niet altijd "klaar voor gebruik".

De manier waarop je het "kan" doen in de voorbeelden gegeven (subselect met een distinct gebruiken in een IN() statement, of een join) is zo ongelooflijk fout dat ik je je C4 zou geven mocht je bij mij werken en dergelijke dingen uithalen.

Afhankelijk van wat hij nu exact wil doen. We hebben hier geen exacte gegevens over wat hij wil van data en hoe de db opgebouwd is. Maar dit nadien gaan oplossen in code dat is zeker de foute keuze.

Ofwel is de db opbouw gewoon verkeerd ofwel een foute query. Ik heb het hier nu niet enkel over dit geval specifiek.

Sick-Boy

Legacy Member
Mijn tabelstructuur is heel simpel:

PHP:
--
-- Tabelstructuur voor tabel `WedstrijdTabel`
--

CREATE TABLE `WedstrijdTabel` (
  `WedstrijdID` int(11) NOT NULL AUTO_INCREMENT,
  `WedstrijdThuisID` int(11) NOT NULL,
  `WedstrijdUitID` int(11) NOT NULL,
  `WedstrijdThuisScore` int(11) DEFAULT NULL,
  `WedstrijdUitScore` int(11) DEFAULT NULL,
  `WedstrijdDatum` datetime NOT NULL,
  PRIMARY KEY (`WedstrijdID`)
) ENGINE=MyISAM;

En na de post van wonko is mijn query de volgende:

PHP:
SELECT Wed.WedstrijdID AS wID, Wed.WedstrijdDatum AS wDatum, Wed.WedstrijdUitScore AS wUitScore, Wed.WedstrijdThuisScore AS wThuisScore, PlU.PloegNaam AS wUitPloeg, PlT.PloegNaam AS wThuisPloeg, Wed.WedstrijdThuisID AS wThuisID, Wed.WedstrijdUitID AS wUitID FROM WedstrijdTabel AS Wed INNER JOIN PloegenTabel AS PlU ON (PlU.PloegID = Wed.WedstrijdUitID) INNER JOIN PloegenTabel AS PlT ON (PlT.PloegID = Wed.WedstrijdThuisID) WHERE Wed.WedstrijdDatum < NOW() ORDER BY Wed.WedstrijdDatum DESC LIMIT 4

Waarbij ik dus de juiste 4 wedstrijden als resultaat krijg met de laatste wedstrijd als eerste resultaat (omgekeerde volgorde dus).

Het is al een paar jaar geleden dat ik SQL heb gehad maar ik heb zo geleerd mijn tabellen op te bouwen.

wonko

Legacy Member
Hij wil gewoon de laatste 4 wedstrijden, en ze moeten in het lijstje op de site van laatste naar 4delaatst staan. De DB geeft ze terug in de andere volgorde (4delaatst tot laatst). Dat was eerder in de thread al aangegeven. Een eenvoudige array_reverse() zal normaal voldoende zijn.

Sick-Boy

Legacy Member
Eigelijk niet, want dan krijg je nog steeds in dezelfde volgorde de array, alleen de indexen wisselen.

In de plaats van

$totalLoop .= $currentLoop;

zet ik nu:

$totalLoop = $currentLoop.$totalLoop;
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan