[php] totaal query in een limit query

Pagina: 1
Acties:

  • Vulpecula
  • Registratie: April 2001
  • Laatst online: 08-09 22:13
Ik heb dit gemaakt.
PHP:
1
<?$aantal=mysql_query("SELECT*FROM news");$aantal_nieuwspostingen=mysql_num_rows($aantal);$result=mysql_query("SELECT nieuws_id,datum,titel,kort FROM news WHERE del='nee' ORDER BY datume DESC LIMIT $aantal_rijen");?>

Moet eerst de totaal aantal nieuwsposten weten. Daarna moeten de 10 laatste worden weergegeven. Maar nu wordt de database 2 keer opnieuw aangeroepen. Is het mogelijk om deze 2 query's in elkaar te verwerken, zodat ik toch het aantal nieuwsposten weet en dat de laatste 10 worden weergegeven.

  • Grum
  • Registratie: Juni 2001
  • Niet online
Z O E K E N

van: http://www.mysql.com/doc/S/E/SELECT.html
SQL_CALC_FOUND_ROWS tells MySQL to calculate how many rows there would be in the result, disregarding any LIMIT clause. The number of rows can be obtained with SELECT FOUND_ROWS().
ZUCHT

  • Vulpecula
  • Registratie: April 2001
  • Laatst online: 08-09 22:13
sorry dat ik niet eerst gezocht had bij http://www.mysql.com

Ik heb dit nu gedaan.
PHP:
1
<?$result=mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM news WHERE del='nee' ORDER BY datume DESC LIMIT $aantal_rijen");?>

Maar krijg een error
Warning: Supplied argument is not a valid MySQL result resource in \nieuws\nieuws_headline.php3 on line 15

Op regel 15 staat
PHP:
1
<? $rij=mysql_fetch_row($result); ?>

Kun je me misschien helpen?

Verwijderd

ik zag dit ook nog ergens voorbij komen:
FOUND_ROWS()
Returns the number of rows that the last SELECT SQL_CALC_FOUND_ROWS ... command would have returned, if wasn't restricted with LIMIT.
SELECT SQL_CALC_FOUND_ROWS * FROM table_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();

The second select will return how many rows the SELECT should have returned if we would remove the LIMIT clause. Note that if you are using SELECT SQL_CALC_FOUND_ROWS ... MySQL has to calculate all rows in the result set. This is however faster than if you would not use LIMIT as the result set doesn't have to be sent to the client

Verwijderd

Waarom moeilijk doen als het makkelijk kan. Welke rijen zijn er extra in je 2e query die je niet in je eerste query al te pakken hebt gehad?

1e query: SELECT * FROM news ORDER BY datume

En dan maar een for lusje over de result-set heenhalen waarbij je $aantal_rijen keer itereert. Of een while met conditionele verhoging van de variabele (aangezien je een extra constraint hebt meegegeven.

Aangezien je de lus toch al hebt staan voor het afbeelden, is dit niet veel tijdsverlies, vergeleken bij het 2x selecten uit een database. :)

  • Vulpecula
  • Registratie: April 2001
  • Laatst online: 08-09 22:13
De eerste query moet het totaal aantal rijen die in de database staan weergegeven. De tweede query moet de laatste 10 nieuwsberichten weergegeven.

Verwijderd

Wat Hieronymus bedoeld is waarschijnlijk gewoon zoiets:
PHP:
1
<?$result=mysql_query("SELECT * FROM news WHERE del='nee' ORDER BY datume DESC");$i = 0;do{$i++;}while($rij = mysql_fetch_row($result) &amp;&amp; $i < 10);?>

dus niet met de limit in mysql werken maar met een tellertje.

  • Grum
  • Registratie: Juni 2001
  • Niet online
dan is 2 queries efficienter

je kan zelfs een count(*D as Num ... limit 10 doen .. krijg je wel 10x et Num :)

  • T. van Beek
  • Registratie: Januari 2002
  • Laatst online: 13-10-2024

T. van Beek

flickritus

Alstu:
PHP:
1
<?$sql = "SELECT nieuws_id,datum,titel,kort FROM news WHERE del='nee' ORDER BY datume DESC LIMIT $aantal_rijen";$result = mysql_query($sql) or die(mysql_error());$aantal = mysql_num_rows($result);echo "$aantal";while ($row = mysql_fetch_object($result)) {echo "Hier het nieuwsberichten dingen uit db halen";}?>

http://flickr.com/photos/itommy/


Verwijderd

De eerste query moet het totaal aantal rijen die in de database staan weergegeven. De tweede query moet de laatste 10 nieuwsberichten weergegeven.
:) Ja dat snap ik ook wel. Maar zoals gezegd, wat biedt de 2e query extra boven de eerste? De eerste bevat namelijk al alle rijtjes die in de database zitten. Dus de 2e query is alleen maar voor de luie programmeur die er niets om geeft nog een database call te doen!
Een lusje die $aantal_rijtjes itereert over de eerste query biedt exact hetzelfde als een lusje dat over de gehele 2e query itereert (gegeven dat de WHERE clause wordt weggelaten.)

Als we echter dit doen:
code:
1
2
3
4
5
6
7
8
9
$result=mysql_query("SELECT * FROM news ORDER BY datume");
$iter=0;
while($iter<$aantal_rijen) {
  $row=mysql_fetch_object($result); # gegeven dat er genoeg rijen zijn.
  ...<blaat>...
  if($row->del == 'nee') {
    $iter++;
  }
}

Dan is er geen probleem, en doe je exact hetzelfde met 1 database access.

Verwijderd

bovengenoemde oplossingen werken ook allemaal. En geven allemaal aan hoe het met 1 query is op te lossen.
:)
Ik moet toch es sneller leren typen ;)

  • T. van Beek
  • Registratie: Januari 2002
  • Laatst online: 13-10-2024

T. van Beek

flickritus

Bij mijn script bekijkt hij eerst hoeveel lines er overeen komen met wat je als SELECT hebt staan. Dat geeft hij 1 keer weer, en dan komt de loop die je nieuwsberichten laten zien :)

Hoop dat je er wat aan hebt...

http://flickr.com/photos/itommy/


Verwijderd

Op zondag 10 maart 2002 15:48 schreef Exercy het volgende:
Alstu:
PHP:
1
<?$sql = "SELECT nieuws_id,datum,titel,kort FROM news WHERE del='nee' ORDER BY datume DESC LIMIT $aantal_rijen";$result = mysql_query($sql) or die(mysql_error());$aantal = mysql_num_rows($result);echo "$aantal";while ($row = mysql_fetch_object($result)) {echo "Hier het nieuwsberichten dingen uit db halen";}?>
Maar zo krijg je dus NIET het totaal aantal nieuwsberichten, $aantal is dan altijd 10...

  • Vulpecula
  • Registratie: April 2001
  • Laatst online: 08-09 22:13
Op zondag 10 maart 2002 15:49 schreef Hieronymus het volgende:

[..]
PHP:
1
<?$result=mysql_query("SELECT * FROM news ORDER BY datume");$iter=0;while($iter<$aantal_rijen) {  $row=mysql_fetch_object($result); # gegeven dat er genoeg rijen zijn.  ...<blaat>...  if($row->del == 'nee') {    $iter++;  }}?>
Bedankt, zo werkt hij. Had ik zelf nog niet aan gedacht.

Verwijderd

Op zondag 10 maart 2002 15:44 schreef Grum het volgende:
dan is 2 queries efficienter

je kan zelfs een count(*D as Num ... limit 10 doen .. krijg je wel 10x et Num :)
Dit hangt helemaal van de gebruikte dataset af, en wat voor databaseserver en webserver je hebt draaien.

Stel dat meteen de eerste 10 fetch_rows voldoen aan het criteria del='nee' dan is het gebruik van 2 queries 100% zeker niet sneller dan het loopen over de gehele set.
Als de kans van een del='nee' afneemt, dwz del='ja' komt veel vaker voor, dan ga je sneller naar een andere oplossing toe werken, zoals 2 queries.

  • Grum
  • Registratie: Juni 2001
  • Niet online
dit is dus niet slim he .. als je dan 1000000 records hebt gaatie ze allemaal ophalen en er 999990 wegsmijten.

Verwijderd

Grum, je hebt gelijk, maar het is ook niet bedoeld als een ultiem antwoord, maar een quick-and-dirty oplossing die in het ergste geval beter is dan de die van de OP.
Ik sla er nog even mijn databases boek op na, om te zien of ik het aantal rijen van een tabel niet beter kan definieren.

  • Grum
  • Registratie: Juni 2001
  • Niet online
keep in mind dat et hier om mysql gaat he .. dat is nou niet echt 100% SQL compatible :P

Verwijderd

Query om alle tupels (rijen) uit een tabel te tellen:
code:
1
SELECT COUNT(*) FROM news

Je komt dan echter nog niet om het 2 query probleem heen.
Je 2e query wordt dan gewoon:
code:
1
SELECT nieuws_id,datum,titel,kort FROM news WHERE del='nee' ORDER BY datume DESC LIMIT $aantal_rijen

Als je echter een groot aantal rijen hebt is dit een betere oplossing dan degene die ik eerst gaf.

Verwijderd

Op zondag 10 maart 2002 16:10 schreef Grum het volgende:
keep in mind dat et hier om mysql gaat he .. dat is nou niet echt 100% SQL compatible :P
Keep in mind dat geen een SQL server 100% SQL compatibel is, en dat SQL geen echte query taal is. Formeel gezien is niet te bewijzen dat een SQL query de goede resultaten uitspuugt :)
Maar MySQL kan wel een count uitvoeren volgens mij :9

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 10:08
Wachten op mysql 4 en dan subqueries gebruiken :+

Verwijderd

Wat versta je onder subqueries??
code:
1
SELECT * FROM blaat WHERE id NOT IN (SELECT id FROM blaat2) INTERSECT (SELECT id from blaat3)

dit kan ook in alle huidige versies van mysql volgens mij hoor, en dit zijn toch echt subqueries :)

  • Grum
  • Registratie: Juni 2001
  • Niet online
raar dat er nix over op de manual page staat dan

http://www.mysql.com/doc/manual.php?search_query=intersect

Verwijderd

Nee inderdaad... Union is vanaf 4.0 beschikbaar en intersect nog niet hoor...

Verwijderd

:) ok... Maar laat het deel na intersect weg, en je hebt nog steeds een subquery.
Pagina: 1