Pagination met WHERE name like %dirk%
Ik ben bezig met het maken van een pagination waarbij het ook mogelijk is om een zoekterm op te geven.
Om de pagination te initialiseren moet ik weten hoeveel rijen er komen uit:
"SELECT * FROM mytable WHERE name LIKE%dirk%"
stel dat er 40 resultaten zijn met de combi "dirk" en dat ik 25 resultaten per pagina wil laten zien.
dan heb ik dus twee pagina's nodig.
maar hoe kom ik aan dat getal 40?
je kan natuurlijk doen:
"SELECT COUNT(*) FROM mytable WHERE name LIKE %dirk%"
en daarna
"SELECT * FROM mytable WHERE name LIKE %dirk% LIMIT 25"
Maar wat ik jammer vind is dat dit in twee queries moet.
Dus mijn vraag: is dit gebruikelijk of kan dit ook in één query, en hoe?
Alvast bedankt,
Frank
Je kan het toch samenvatten..
alleen zodra ik dat doe krijg ik altijd maar één rij terug, en ik wil wel alle rijen terug die voldoen aan de WHERE.
http://php.net/manual/en/function.mysql-num-rows.php
Het voorbeeld van Bart is fout, in theorie moet daar een group by achter maar ook dan krijg je verkeerde resultaten. De oplossing: gebruik alleen je 1e query en check in php met de mysql_num_rows (Get number of rows in result) functie hoeveel rijen er gevonden zijn. Code (php)
1
2
3
4
5
2
3
4
5
<?php
$result = msql_query("SELECT iets,nogiets FROM table1", $link);
$num_rows = mysql_num_rows($result);
echo "$num_rows Rows\n";
?>
$result = msql_query("SELECT iets,nogiets FROM table1", $link);
$num_rows = mysql_num_rows($result);
echo "$num_rows Rows\n";
?>
Gewijzigd op 21/11/2012 22:04:16 door John D
Hetgeen jij voorstelt dat werkt, maar is niet wat ik wil omdat deze query heel veel rijen kan terug geven terwijl ik er maar maximaal 25 gebruik per pagina. Hetgeen zou betekenen dat de server het veel zwaarder voor zijn kiezen krijgt dan nodig is :)
Groet, Frank
Gewijzigd op 21/11/2012 22:47:07 door Frank Nietbelangrijk
Nick Dijkstra op 21/11/2012 22:21:47:
Hoort het niet zo?
Nee, dat geeft onjuiste resultaten en eigenlijk zou je een melding moeten krijgen, NOT a GROUP BY function on nogeenkolom. Ga je vervolgens een group by toevoegen dan krijg je alsnog een goeie kans onjuiste resultaten. Soms gaat het goed, dit is afhankelijk van de cardinaliteit van de rest van de kolommen maar het gebruik is gegevenstechnisch onjuist.
@Frank Nietbelangrijk
Je schrijft: stel dat er 40 resultaten zijn met de combi "dirk" en dat ik 25 resultaten per pagina wil laten zien. Dan geenft MySQLNumRows toch 40 en dat wil je toch??
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT COUNT(*) AS total,
nogeenkolom
FROM
mytable
WHERE
name LIKE '%dirk%'
LIMIT 25;
nogeenkolom
FROM
mytable
WHERE
name LIKE '%dirk%'
LIMIT 25;
@Frank Nietbelangrijk
Je schrijft: stel dat er 40 resultaten zijn met de combi "dirk" en dat ik 25 resultaten per pagina wil laten zien. Dan geenft MySQLNumRows toch 40 en dat wil je toch??
Gewijzigd op 21/11/2012 22:29:52 door John D
als je LIMIT 25 weglaat dan geeft NumRows 40. Maar geef je LIMIT 25 dan is NumRows 25.
Klopt en met die 40 records en het getal 40 ga je aan de slag om twee of meer pagina's te maken.
Code (php)
1
2
3
4
2
3
4
SELECT SQL_CALC_FOUND_ROWS kolom1, kolom2, kolom3
FROM mytable
WHERE name LIKE%dirk%
LIMIT 0, 25
FROM mytable
WHERE name LIKE%dirk%
LIMIT 0, 25
Daarna nog een query om het aantal uitgerekende rijen op te halen:
Ja, je hebt wel een tweede query nodig, maar die tweede query is echt het probleem niet. SQL_CALC_FOUND_ROWS heeft wel een performance impact, maar zolang je het niet over een tabel van honderduizenden records hebt zou ik me daar geen zorgen over maken.
Gewijzigd op 22/11/2012 08:02:57 door Erwin H
Dit helpt mij denk ik de goede weg op. Ik ga er vanavond mee aan de slag.
Heel erg Bedankt,
Groet Frank
Als geen GROUP BY voorkomt in een query met een aggegrate functie wordt de gehele tabel als group beschouwd. Het meest directe, dus het snelste.