Avatar billede Mik2000 Professor
13. februar 2012 - 23:09 Der er 6 kommentarer og
1 løsning

Hent fra database og vis x antal

Hej

Jeg henter poster fra database, og sætter en limit
SELECT * FROM adresser LIMIT 30, 0

Meningen er så at jeg nedenunder resultaterne skal have så man klikke næste og så se de næste 30 osv.

Mit problem er at jeg skal bruge en optælling af hvormange der er.

Er den bedste måde at gøre det på, ved at lave endnu en SQL som hedder: SELECT count(*) FROM adresser eller alternativt SELECT * FROM adresser og så counte bagefter

Eller er der en smartere måde at gøre det på, så man får antallet uden limit, men kun data fra dem man har limiteret?
... således at man kun skal køre en SQL og belaster database og server mindre?
Avatar billede showsource Seniormester
14. februar 2012 - 01:27 #1
Når siden requestes, henter du de rows du har brug for.
Så vil du ikke belatse mindre mindre ved at hente alle på en gang.
De skal jo så hentes ved hver request.
En
SELECT COUNT(*) FROM tabel
vil gi' antal mulige, og vil belaste mindre ved hver request.

Og så er det vel
SELECT * FROM adresser LIMIT x, 30
du mener. Hvor x er fra hvilket row nr. der skal hentes.
14. februar 2012 - 07:10 #2
Du taler om 'pagination'.  Jeg fandt denne tutorial om pagination http://php.about.com/od/phpwithmysql/ss/php_pagination_3.htm .  I den tutorial finder man først total antal rækker ved en separat forespørgsel, og derefter henter man for hver side de rækker der skal vises på hver side ved LIMIT.

I den første forespørgsel i den tutorial finder man total antal rækker ved SELECT * FROM mytable og derefter i php $rows = mysql_num_rows($result).  Der ville jeg nok i stedet forespørge SELECT COUNT(*) FROM mytable og så i php $antal = mysql_result($result, 0).
Avatar billede Zifle Nybegynder
14. februar 2012 - 13:11 #3
Du kan bruge SQL_CALC_FOUND_ROWS.

SELECT SQL_CALC_FOUND_ROWS * FROM adresser LIMIT 0,30

Du skal dog være opmærksom på at du skal lave endnu en query lige efter, hvor du bruger FOUND_ROWS():

SELECT FOUND_ROWS()

Så det bliver således, i php:

$query1 = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM adresser LIMIT 0,30");
$query2 = mysql_query("SELECT FOUND_ROWS()");
$fetch = mysql_fetch_array($query2);
$rows = $fetch[0];

Hvorefter du så kan få resten af dine resultater som normalt med $query1.
Avatar billede Mik2000 Professor
17. februar 2012 - 18:05 #4
Hej
Tak for svarene
Undskyld det tog lidt tid, men skulle lige læse lidt om de forskellige ting

Jeg er blevet lidt klogere men ikke så meget.
Kan forstå man nok er nød til 2, men nu leder jeg lidt efter hvad der er hurtigst og giver mindst belastning af server og database:

Mulighed 1:
$query1 = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM adresser LIMIT 0,30");
$query2 = mysql_query("SELECT FOUND_ROWS()");

Mulighed 2:
SELECT COUNT(*) FROM tabel
SELECT * FROM adresser LIMIT x, 30

Mulighed 3:
SELECT id FROM tabel
mysq_num_row(ovenstående)
SELECT * FROM adresser LIMIT x, 30
19. februar 2012 - 06:42 #5
mik2000, du fik ingen bud på hvilket af dine alternativer der er hurtigtst o.s.v.  Jeg har heller ingen videnskabelig erfaring dermed.  Derfor holdt jeg mig tilbage.

Men på den pragmatiske side, #1 og #2 (mig) foreslår mulighed2.  Det forekommer mig umiddelbart det enkleste og bedste.  Mulighed1: det med 'SQL_CALC_FOUND_ROWS' kender jeg ikke selv, men jeg betvivler, at den skulle være bedre end den simplere løsning SELECT COUNT(*), og forøvrigt synes det med '..LIMIT 0, 30' at gå imod hensigten, idet det er det totale antal rækker du skal bruge.  Mulighed3, jeg kan ikke se hensigten med at hente 1000 resultater fra databasen (hvis du har 1000 rækker i tabellen) når du kun har brug for et resultat, nemlig antallet af rækker.

Jeg opretter dette som svar, idet jeg mener at have bidraget til at løse det opstillede problem.  Du vil velsagtens invitere svar fra andre bidragydere også.
20. februar 2012 - 16:02 #6
Her kom svaret, det smuttede igår.
Avatar billede Mik2000 Professor
23. februar 2012 - 02:56 #7
Tak for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester