Laatste 10 records ASCENDING
Probleem: Ik wil de laatste 10 records in mijn table uitlezen. (ORDER BY xxx DESC limit 10) maar dan in een oplopende volgorde.
nu heb ik hier iets op verzonnen. maar vind ik het zelf een erg omslachtige manier. Misschien dat jullie een andere oplossing hebben. Mijn huidige code hiervoor is:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
$select = "SELECT name,message FROM table";
$result = mysql_query($select);
if (mysql_num_rows($result) > 10) {
$offset = mysql_num_rows($sesult) - 10;
}
else {
$offset = 0; //Als er minder dan 10 records zijn gewoon de eerste 10 pakken
}
$select = "SELECT name,message FROM table ORDER by id LIMIT ".$offset.",10";
$result = mysql_query($select);
while ($row = mysql_fetch_array($result)) {
echo $row['name'] . "-" . $row['message'];
}
$result = mysql_query($select);
if (mysql_num_rows($result) > 10) {
$offset = mysql_num_rows($sesult) - 10;
}
else {
$offset = 0; //Als er minder dan 10 records zijn gewoon de eerste 10 pakken
}
$select = "SELECT name,message FROM table ORDER by id LIMIT ".$offset.",10";
$result = mysql_query($select);
while ($row = mysql_fetch_array($result)) {
echo $row['name'] . "-" . $row['message'];
}
zoals jullie zien is dit volgens mij erg omslachtig. heeft iemand hiervoor een efficientere manier?
DESC ... aflopend
ORDER BY xxx ASC limit 10
Je kunt alleen de laatste 10 laten zien als je daadwerkelijk een datum/tijd stempel in je database hebt. Order by datum dus.
@Tim Hij order automatisch ASC dus dat hoeft niet aangegeven de worden. dan kan je met limit idd de EERSTE 10 records uitlezen. maar ik wil de laatste 10 records.
@Jurgen: Ik heb er een datum notitie bij staan. maar ook als ik daarop order werkt het niet.
Nogmaals mijn probleem stellingen omdat ik niet denk dat iedereen het helemaal begrijpt.
Ik wil de LAATSTE 10 records van mijn database weergeven.
stel nu ik heb een database van 70 records. dan wil ik record 61 tot en met 70 weergeven.
Als ik dit doe op de volgende manier:
krijg ik de records in de volgende volgorde:
70. 69, 68 ,67 ,66 ,65, 64, 63, 62, 61
maar ik wil ze in de volgorde:
61, 62, 63, 64, 65, 66, 67, 68, 69, 70
hebben.
Nu doe je dit met:
nu is 61 in dit geval variable. Dit bereken ik nu door al mijn records te pakken (select name, message from table).
Dit te tellen (mysql_num_rows($select))
hier weer 10 van af te trekken (offset = mysql_num_rows($select) -10;
en dat in de query te gooien
Dit werkt zoals het hoord. Het probleem is dat ik nu 10 regels gebruik ipv. 1 die ik zou willen gebruiken.
Is het mogelijk om dit allemaal in 1 regel te doen. (de laatste 10 records in oplopende volgorde selecteren)
Wat voor veldtype is je datumnotatie :)?
DATETIME. zoals ik eigenlijk altijd mijn datums noteer omdat je hier alles uit kan halen wat je wil.
ORDER BY datum DESC LIMIT 0,10
?
Jacco schreef op 02.06.2008 11:30:
Mischien zie ik iets over het hoofd hier maar is het neit :
ORDER BY datum DESC LIMIT 0,10
?
ORDER BY datum DESC LIMIT 0,10
?
Oplopend toch? ASC.
Quote:
Probleem: Ik wil de laatste 10 records in mijn table uitlezen.
DESC ;)
ok allebei half. Hij wil eerst wat ik zeg (de 10 nieuwsten) en volgens wil hij die ASC
Gewijzigd op 01/01/1970 01:00:00 door Jacco Engel
Thijs Damen schreef op 02.06.2008 10:51:
.. maar dan in een oplopende volgorde.
dus jacco, ook hier bij ORDER BY datum DESC LIMIT 0,10 krijg je de 10 nieuwste, alleen dan: niewste, een-na-nieuwste, , , , , etcetc)
Dus het moet allebei!
(kijk eens goed naar mijn voorbeeld, daar bereken ik de offset (totaal - 10) om het daarna op desc te pakken). alleen gebruik ik hier 10(!) regels voor.
Als je sorteert op 2 verschillende kolommen is het echter een ander verhaal. Bijvoorbeeld DESC op een tijd en vervolgens ASC op een naam om de resultaten in alfabetische volgorde te krijgen:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
naam,
datumtijdveld
FROM
tabel
ORDER BY
datumtijdveld DESC,
naam ASC
LIMIT 10 OFFSET 0
naam,
datumtijdveld
FROM
tabel
ORDER BY
datumtijdveld DESC,
naam ASC
LIMIT 10 OFFSET 0
ps. Overigens sorteer je nu op een id om een volgorde van records in tijd te bepalen. Dat is hoogst onbetrouwbaar en eigenlijk gewoon fout omdat een id je daar helemaal niets over kan vertellen. Het id 231 geeft je dezelfde informatie als id 40302 of 1, namelijk enkel de aanduiding van een uniek record.
Sorteren van records in de loop van tijd doe je dus ook altijd op een datumtijdstempel die je bij elk record opslaat.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Je zult dan een subquery met een limit moeten schrijven denk ik maar probleem is dat mysql geen limits in subquerys ondersteunt
ik volg je logica alleen werkt het niet.
(ik heb hem een beetje aangepast:
SELECT id,naam,bericht,datum
FROM tabel
ORDER BY datum DESC, id ASC
Limit 10 OFFSET 0
Hij geeft nu gewoon de laatste 10 records in aflopende volgorde weer (nieuwste eerst, 2e, 3e, 4e ipv. Laatste eerst, 9e, 8e, 7e etc.)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
naam,
datumtijdveld
FROM
(
SELECT
naam,
datumtijdveld
FROM
tabel
ORDER BY
datumtijdveld DESC
LIMIT 10
) AS limited_records
ORDER BY
datumtijdveld ASC
naam,
datumtijdveld
FROM
(
SELECT
naam,
datumtijdveld
FROM
tabel
ORDER BY
datumtijdveld DESC
LIMIT 10
) AS limited_records
ORDER BY
datumtijdveld ASC
Getest in postgresql, maar je moet maar eens proberen of dat ook werkt in MySQL. Want limits in een subquery is inderdaad iets dat niet echt lekker gaat daarmee...
nieuwste versie dus nee gaat niet werken ;)
Maar klopt je tijdstempel wel, is het wel de datum wanneer het record is aangemaakt, anders gaat het natuurlijk niet werken.
Kijk, getest en het werkt. gebruik momenteel
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT
id,
name
message
date
FROM
(
SELECT
id,
name,
message,
date
FROM
table
ORDER BY
date DESC
LIMIT 10
) AS limited_records
ORDER BY
date ASC
id,
name
message
date
FROM
(
SELECT
id,
name,
message,
date
FROM
table
ORDER BY
date DESC
LIMIT 10
) AS limited_records
ORDER BY
date ASC
(dit is op: Client API version 3.23.49 )
en werkt naar behoren (testje op hiero
Gewijzigd op 01/01/1970 01:00:00 door Thijs Damen