Pagination met WHERE name like %dirk%

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Frank Nietbelangrijk

Frank Nietbelangrijk

21/11/2012 21:06:05
Quote Anchor link
Hallo allemaal,

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
 
PHP hulp

PHP hulp

23/12/2024 18:53:58
 
Bart V B

Bart V B

21/11/2012 21:18:03
Quote Anchor link
Waarom in 2 query's?
Je kan het toch samenvatten..
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT COUNT(*) AS total,
       nogeenkolom
       FROM
       mytable
       WHERE
       name LIKE %dirk%
       LIMIT 25;
 
Frank Nietbelangrijk

Frank Nietbelangrijk

21/11/2012 21:29:59
Quote Anchor link
Dank je wel voor de reactie Bart.

alleen zodra ik dat doe krijg ik altijd maar één rij terug, en ik wil wel alle rijen terug die voldoen aan de WHERE.
 
John D

John D

21/11/2012 22:00:27
Quote Anchor link
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. http://php.net/manual/en/function.mysql-num-rows.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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";
?>
Gewijzigd op 21/11/2012 22:04:16 door John D
 
Frank Nietbelangrijk

Frank Nietbelangrijk

21/11/2012 22:14:20
Quote Anchor link
Hey, John. Jij ook bedankt voor je reactie.
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

Nick Dijkstra

21/11/2012 22:21:47
Quote Anchor link
Hoort het niet zo?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT COUNT(*) AS total,
       nogeenkolom
       FROM
       mytable
       WHERE
       name LIKE '%dirk%'
       LIMIT 25;
 
John D

John D

21/11/2012 22:27:36
Quote Anchor link
Nick Dijkstra op 21/11/2012 22:21:47:
Hoort het niet zo?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT COUNT(*) AS total,
       nogeenkolom
       FROM
       mytable
       WHERE
       name LIKE '%dirk%'
       LIMIT 25;
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??
Gewijzigd op 21/11/2012 22:29:52 door John D
 
Frank Nietbelangrijk

Frank Nietbelangrijk

21/11/2012 22:48:57
Quote Anchor link
John,

als je LIMIT 25 weglaat dan geeft NumRows 40. Maar geef je LIMIT 25 dan is NumRows 25.
 
John D

John D

21/11/2012 23:04:47
Quote Anchor link
Klopt en met die 40 records en het getal 40 ga je aan de slag om twee of meer pagina's te maken.
 
Erwin H

Erwin H

22/11/2012 08:02:32
Quote Anchor link
Het meest gebruikte in deze situatie is de MySQL functie SQL_CALC_FOUND_ROWS:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT SQL_CALC_FOUND_ROWS kolom1, kolom2, kolom3
FROM mytable
WHERE name LIKE%dirk%
LIMIT 0, 25

Daarna nog een query om het aantal uitgerekende rijen op te halen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT FOUND_ROWS() AS aantal

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
 
Frank Nietbelangrijk

Frank Nietbelangrijk

22/11/2012 16:17:08
Quote Anchor link
Hey Erwin,

Dit helpt mij denk ik de goede weg op. Ik ga er vanavond mee aan de slag.

Heel erg Bedankt,

Groet Frank
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/11/2012 11:21:30
Quote Anchor link
Als je gewoon het aantal rijen van een query wilt weten, gebruik je gewoon COUNT(*). Dus
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT COUNT(*) FROM mytable WHERE name LIKE '%dirk%'

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.
 



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.