Toon posts:

[PHP] vooruit/achteruit in database

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een probleempje waar ik geen oplossing voor weet, maar wel een code heb die (deels) werkt.

onder een bericht die verschijnt op mijn website moet ik een verder en terug optie hebben om in de berichten te kunnen bladeren welke in een bepaalde categorie staan. het stukje code wat ik heb werkt wel, alleen treed er een probleem op als er een id mist en het browsen overloopt in een andere categorie. hij zou dan in princiepe een volgende/vorige id moeten pakken die wel aan de voorwaarden voldoet. ik heb dus geen flauw idee hoe ik dat op een simpele manier kan oplossen en kan inpassen.. Kan iemand me hierbij behulpzaam zijn?

<?
$idterug =$id-1;// TERUG ID BEPALEN
$idverder = $id+1;// VERDER ID BEPALEN

$sql = mysql_query("SELECT * FROM $tabel_news ORDER BY id DESC LIMIT 1") or die("Error<br><hr>".mysql_error());
while (list($id,$titel,$bericht,$cat) = mysql_fetch_row($sql)) {

if($idverder < "$id"){$verder="<a href=\"$PHP_SELF?idverder&cat=$cat\">Verder</a> ";}

if($idterug !="0"){$terug="<a href=\"$PHP_SELF?idterug&cat=$cat\">Terug</a>";}
}
?>

Verwijderd

Je zou iets kunnen proberen als:

Eerst volgende:
"SELECT * FROM $tabel_news WHERE id >= $id ORDER BY id ASC LIMIT 1"

Eerst vorige:
"SELECT * FROM $tabel_news WHERE id <= $id ORDER BY id DESC LIMIT 1"

uit me hoofd en dus niet getest...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Is al een paar keer langs geweest...

Vorige ID kun je bepalen met:
SELECT MAX(id) FROM $table_news WHERE id<$id

Verder haatl je query alleen de eerste op. Ga nog maar eens in de manual van mysql kijken, en dan vooral bij de where :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op donderdag 11 juli 2002 10:47 schreef Debbus het volgende:
Je zou iets kunnen proberen als:

Eerst volgende:
"SELECT * FROM $tabel_news WHERE id >= $id ORDER BY id ASC LIMIT 1"

Eerst vorige:
"SELECT * FROM $tabel_news WHERE id <= $id ORDER BY id DESC LIMIT 1"
Probleem bij deze queries is natuurlijk dat je ipv maar 1 row je halve tabel gemiddeld door je DB laat afhandelen en laat sorteren.

Is nogal een performance hit natuurlijk.

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
Op donderdag 11 juli 2002 11:51 schreef ACM het volgende:
Probleem bij deze queries is natuurlijk dat je ipv maar 1 row je halve tabel gemiddeld door je DB laat afhandelen en laat sorteren.
Ik mag hopen dat MySQL naar de LIMIT clause kijkt voordat er met het sorteren wordt begonnen???

Pas de replâtrage, la structure est pourrie.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op donderdag 11 juli 2002 17:24 schreef Apollo_Futurae het volgende:

[..]

Ik mag hopen dat MySQL naar de LIMIT clause kijkt voordat er met het sorteren wordt begonnen???
Dat kan natuurlijk niet.
Hij weet niet of er 'gaten' in de id's zitten.

Who is John Galt?


  • bras
  • Registratie: Oktober 2000
  • Laatst online: 13-08 14:08
met 'limit x, 1' heb je het x'te element.

met 'limit x-1, 1' heb je dan de voorganger en met 'limit x+1, 1' heb je de dan de volgende.

met een sort by id komt dat allemaal goed denk ik :)

"When you find yourself in the company of a halfling and an ill-tempered Dragon, remember, you do not have to outrun the Dragon...you just have to outrun the halfling."


  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
Op donderdag 11 juli 2002 17:25 schreef justmental het volgende:
Dat kan natuurlijk niet.
Hij weet niet of er 'gaten' in de id's zitten.
Nee, maar hij kan toch wel van tevoren zien dat er uiteindelijk maar 1 record geretourneerd hoeft te worden. Hij hoeft alleen maar de hoogste (of laagste) id te vinden dat aan de where clause voldoet - het is volkomen overbodig om de halve tabel te sorteren (zoals ACM zei) en ik mag hopen dat de MySQL optimizer daar rekening mee houdt.

Pas de replâtrage, la structure est pourrie.


Verwijderd

Ik mag hopen dat er op een ID veld een index staat, en dan valt de performance-hit het zoeken nog wel mee.

Verwijderd

Topicstarter
ik heb het zo opgelost, en het werkt, ook als er GATEN in de id-s zitten ;

met dank aan alle bijdragen/tips

$next = mysql_db_query ("$databasenaam", "SELECT * from $tabel WHERE id > '$berichtid' AND actief='1' AND categorie='$cat' LIMIT 0,1") or die ("Invalid query");
while ($nextrow = mysql_fetch_array ($next))
{$nextnummer = $nextrow["id"];}

$back = mysql_db_query ("$databasenaam", "SELECT * from $tabel WHERE id < '$berichtid' AND actief='1' AND categorie='$cat' LIMIT 0,$berichtid") or die ("Invalid query");
while ($backrow = mysql_fetch_array ($back))
{$backnummer = $backrow["id"];}

if($backnummer != ""){$vorige = "<a href=\"$php_self?berichtid=$backnummer&cat=$cat\">Vorige</a>"; }

if($nextnummer != ""){$volgende = "<a href=\"$php_self?berichtid=$nextnummer&cat=$cat\">Volgende</a>"; }

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op donderdag 11 juli 2002 11:51 schreef ACM het volgende:
[..]
Probleem bij deze queries is natuurlijk dat je ipv maar 1 row je halve tabel gemiddeld door je DB laat afhandelen en laat sorteren.

Is nogal een performance hit natuurlijk.
Klopt, een betere query ervoor zou zijn
code:
1
2
3
4
// vorige
SELECT MAX(id) FROM $tabel_news WHERE id < $id 
// volgende
SELECT MIN(id) FROM $tabel_news WHERE id > $id

;)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
code]// vorige
SELECT MAX(id) FROM $tabel_news WHERE id < $id
// volgende
SELECT MIN(id) FROM $tabel_news WHERE id > $id [/code]
[/quote]

maar dan vraag je de maximale ID en de LAAGSTE id op, en dat wilde ik niet, ik wilde namelijk wanneer ik op id 4 sta ofzo, met VERDER naar de volgende ID die aan een aantal criteria voldoet, en bij het TERUG gaan idem. Als er dan GATEN in de id's zitten, door het wissen van items ofzo, dan kun je desondanks toch nog bladeren in je gegevens.
Pagina: 1