[PHP/MYSQL] Hoeveelste record

Pagina: 1
Acties:
  • 111 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 19:46
Hallo Tweakers :)

Ik zit met een probleempje,

Ik heb een mysql tabel.

deze heeft 30 records,

dmv PHP print ik deze op een pagina verdeeld over pagina's van 10.
elke record heeft zijn eigen unieke ID.

nu wil ik graag weten hoe ik dmv een ID de hoeveelste record het is in een rij.

dus als ik bijvoorbeeld een ID heb, ID 23, (die normaal op de 2de pagina terecht komt).
hoe kan ik dan het beste uitrekenen, is hier misschien een query voor ofzo?

hoop dat ik mun vraag duidelijk heb uitgelegd :), in de search kon ik niks vinden wat me hielp.

[ Voor 11% gewijzigd door Scotix op 12-05-2006 13:20 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je wil, als iemand ID 23 doorgeeft, kijken op welke plaats (pagina) hij staat? Lijkt me simpel: alle records ophalen die in de sortering boven dat record staan (als je op ID sorteert dus alle ID's kleiner dan 23), en daar de count van nemen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 19:46
maar als het om grotere aantallen gaat,
dus bijvoorbeeld ID 99 (die op bijvoorbeeld pagina 10 moet), dan krijg je toch grotere queries, kan dit niet makelijker?

Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

-NMe- schreef op vrijdag 12 mei 2006 @ 13:25:
Je wil, als iemand ID 23 doorgeeft, kijken op welke plaats (pagina) hij staat? Lijkt me simpel: alle records ophalen die in de sortering boven dat record staan (als je op ID sorteert dus alle ID's kleiner dan 23), en daar de count van nemen.
Hoe doen ze dat eigenlijk bij grotere aantallen, zoals hier op GoT? Hier heb je topics van 1000 posts, maar telkens een COUNT() doen op een subset daarvan lijkt me niet zo geweldig voor de performance?

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 19:50

Gonadan

Admin Beeld & Geluid, Harde Waren
JeRa schreef op vrijdag 12 mei 2006 @ 13:29:
[...]

Hoe doen ze dat eigenlijk bij grotere aantallen, zoals hier op GoT? Hier heb je topics van 1000 posts, maar telkens een COUNT() doen op een subset daarvan lijkt me niet zo geweldig voor de performance?
Waarschijnlijk gebruiken ze gewoon LIMIT :)

code:
1
select count(id) from records where id<=?? group by id

Die blijft toch altijd even groot?

[ Voor 15% gewijzigd door Gonadan op 12-05-2006 13:31 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • hannos
  • Registratie: Juli 2003
  • Laatst online: 24-05-2024

hannos

pardon me

Je gaat er dus al vanuit dat item met ID 99 op pagina 10 komt. Wil je daarmee zeggen dat de ID's altijd opeenvolgend zijn? Oftewel het kan niet voorkomen dat er geen item met ID van bv. 98 bestaat?

Op die manier is het heel simpel: 99/10+1 = pagina 10 en 99 mod 10 = item 9

Als je er niet zeker van bent dat het een opeenvolgende rij is en er dus items kunnen missen in de rij dan zul je manier van -NMe- moeten gebruiken. Anders weet je het natuulrijk nooit :P

Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Gonadan schreef op vrijdag 12 mei 2006 @ 13:29:
[...]

Waarschijnlijk gebruiken ze gewoon LIMIT :)

code:
1
select count(id) from records where id<=?? group by id

Die blijft toch altijd even groot?
MySQL moet voor een LIMIT toch ook bepalen hoeveel records er zijn aan de hand van een WHERE-clausule, dus dat lijkt me ook niet goed voor de performance :)

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 19:46
de idd's blijven natuurlijk niet hetzelfde:)

het is voor een soort forum. ik wil gewoon weten op welke pagina de ID komt. :)

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 19:50

Gonadan

Admin Beeld & Geluid, Harde Waren
JeRa schreef op vrijdag 12 mei 2006 @ 13:34:
[...]

MySQL moet voor een LIMIT toch ook bepalen hoeveel records er zijn aan de hand van een WHERE-clausule, dus dat lijkt me ook niet goed voor de performance :)
Bij een limit pakt de dbms alle records die aan de clausule voldoen
Daarna pakt hij het stuk wat je met limit aangeeft.
Als je indexen goed staan dan is er niets aan de hand.
En je denkt toch niet echt dat GoT op mySQL draait he?
Scotix schreef op vrijdag 12 mei 2006 @ 13:35:
de idd's blijven natuurlijk niet hetzelfde:)

het is voor een soort forum. ik wil gewoon weten op welke pagina de ID komt. :)
Bij een forum zou ik sowieso een autoincrement gebruiken voor je messages.
Dan kan je aan de hand daarvan heel simpel de plek ophalen :)

[ Voor 27% gewijzigd door Gonadan op 12-05-2006 13:39 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Gonadan schreef op vrijdag 12 mei 2006 @ 13:36:
[...]

Bij een limit pakt de dbms alle records die aan de clausule voldoen
Daarna pakt hij het stuk wat je met limit aangeeft.
Als je indexen goed staan dan is er niets aan de hand.
Als ik een LIMIT doe op 100.000 rows met keurige indices dan is de performance bij een hoge limit lager dan bij lagere limits. Maar met 1000 rows zou het idd nog wel te overzien moeten zijn :)
En je denkt toch niet echt dat GoT op mySQL draait he?
Sorry, MSSQL dan, ook goed. Gelukkig niet dat gare postgres ;)

[ Voor 6% gewijzigd door JeRa op 12-05-2006 13:44 ]

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 19:50

Gonadan

Admin Beeld & Geluid, Harde Waren
JeRa schreef op vrijdag 12 mei 2006 @ 13:43:
[...]

Als ik een LIMIT doe op 100.000 rows met keurige indices dan is de performance bij een hoge limit lager dan bij lagere limits. Maar met 1000 rows zou het idd nog wel te overzien moeten zijn :)
Hmm, heb ik zelf nog nooit meegemaakt. :)

Maar misschien is dat wel de reden dat topics niet groter dan 1000 posts mogen zijn ;)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Gonadan schreef op vrijdag 12 mei 2006 @ 13:46:
[...]

Hmm, heb ik zelf nog nooit meegemaakt. :)
Het is eigenlijk wel logisch, omdat de DBMS toch je WHERE-clausule moet toepassen en dus alle indices en bijbehorende keys moet aflopen die van toepassing zijn. Dan pas kan de DBMS weten hoeveel rows er in feite zijn en kan er een LIMIT toegepast worden.

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Gonadan schreef op vrijdag 12 mei 2006 @ 13:36:
Bij een forum zou ik sowieso een autoincrement gebruiken voor je messages.
Dan kan je aan de hand daarvan heel simpel de plek ophalen :)
Totdat er een bericht verwijdert werd :) ?

DM!


Acties:
  • 0 Henk 'm!

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 19:46
JHS schreef op vrijdag 12 mei 2006 @ 13:49:
[...]
Totdat er een bericht verwijdert werd :) ?
idd, dan heb je bijvoorbeeld een pagina van 9 posts.
de posts moeten dan 1 opschuiven.

dus ik moet gewoon een select maken met een limit tot aan je ID.
en met dat aantal bereken je de pagina?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Scotix schreef op vrijdag 12 mei 2006 @ 13:53:
en met dat aantal bereken je de pagina?
Logisch toch? ;) Als je weet hoeveel berichten er vóór dat bericht staan, en je weet hoeveel berichten er op een pagina passen, dan is het een simpele deling? :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 19:46
hehe true;)

maar goed, daar ging mijn topic niet over:)
de vraag was of er een manier was die de rijnummer returned :) dus dat je niet hoef te berekenen hoeveel ervoor staat :).

dus van, ID 22, query returned: rijnummer 13 bijv.

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Scotix schreef op vrijdag 12 mei 2006 @ 13:59:
hehe true;)

maar goed, daar ging mijn topic niet over:)
de vraag was of er een manier was die de rijnummer returned :) dus dat je niet hoef te berekenen hoeveel ervoor staat :).

dus van, ID 22, query returned: rijnummer 13 bijv.
Je kunt in MySQL ook gewoon rekenen. In plaats van COUNT(rows) vraag je dan COUNT(rows) / aantalperpagina op.

offtopic:
En got draait toch gewoon op MySQL, of ben ik nou gek

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47

TeeDee

CQB 241

Gonadan schreef op vrijdag 12 mei 2006 @ 13:36:
[...]
En je denkt toch niet echt dat GoT op mySQL draait he?
[...]
offtopic:
O? Waar dan op?


edit:

T-MOB dacht precies hetzelfde :)

[ Voor 11% gewijzigd door TeeDee op 12-05-2006 14:17 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Acolyte
  • Registratie: Oktober 2002
  • Laatst online: 28-08-2024

Acolyte

Lid

Sim-pel

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

$i = 1;  //met 1 beginnen, anders miss delen door 0
$perrow = 10; //hoeveel per rij/pagina?

$query = mysql_query("SELECT id FROM tabel WHERE id <= 22");

while($r = mysql_fetch_row($query))
{
     if($r[0] == "22")
     {
          $row = ceil($i / $perrow);
          break;
     }
     $i++;
}
?>


Lijkt mij wel te gaan werken? :)

[ Voor 7% gewijzigd door Acolyte op 12-05-2006 14:19 ]


Acties:
  • 0 Henk 'm!

  • servies
  • Registratie: December 1999
  • Nu online

servies

Veni Vidi Servici

Gonadan schreef op vrijdag 12 mei 2006 @ 13:36:
[...]
En je denkt toch niet echt dat GoT op mySQL draait he?
[...]
Tweakers.net is geprogd in de scripttaal PHP en gebruikt als database backend MySQL 4.0 met InnoDB support. InnoDB wordt gebruikt voor de tabellen die baat hebben bij row-level locking en versioning. Een voorbeeld hiervan is de messages-tabel van het forum, die veel gelijktijdige lees en schrijf queries krijgt te verwerken. De overige tabellen zijn van het standaard MyISAM-type.
Allemaal te lezen hiero

Acties:
  • 0 Henk 'm!

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 30-09-2024

DDemolition

slopen is mijn lust en leven

Heb dit ook ooit gemaakt. Misschien heb je er iets aan om te vergelijken.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$PageLimit = 14;

//Draai je specifieke query
$totalitems = mysql_num_rows($rs);
$TotalPages = ceil($totalitems / $PageLimit);

$FirstSelectedItem = floor(($item - 1) / $PageLimit) * $PageLimit;
$SelectedPage = ($FirstSelectedItem / $PageLimit) + 1;

$SQL = "SELECT ";
$SQL .= "   MSG_ID ";
$SQL .= "FROM ";
$SQL .= "   tblmessages ";
$SQL .= "WHERE ";
$SQL .= "   (MSG_ID = '$strSelectedMessageID' OR MSG_ChildOf = '$strSelectedMessageID') ";
$SQL .= "ORDER BY ";
$SQL .= "   MSG_PostDate ASC ";
$SQL .= "LIMIT $FirstSelectedItem, $PageLimit";
$rs = mysql_query($SQL) or die ("fout: " . mysql_error());
while(list($id)= mysql_fetch_row($rs))
{
//print rijen
}

Ik heb het maar ff globaal geknipt, maar de structuur is hetzelfde.

Je kijkt hoeveel items je hebt en deelt dit door items per pagina. Dit rond je naar boven af.
Om het eerste item te weten doe je dit andersom (dat floor regeltje) en rond je naar beneden af. In de LIMIT clausule kun je bepalen welk items je op wilt halen. Via een <a name="<?=$id?>" kun je nog netjes in naar de goede plaats in het document komen.

Specs: Server, WS boven, WS beneden


Acties:
  • 0 Henk 'm!

Verwijderd

JeRa schreef op vrijdag 12 mei 2006 @ 13:43:
Gelukkig niet dat gare postgres ;)
explain?

Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

offtopic:
Was een retort richting Gonadan die duidelijk aan het zeiken was op MySQL, en in veel gevallen zijn dat postgresfanboys.

[ Voor 3% gewijzigd door JeRa op 12-05-2006 14:43 ]

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Acolyte schreef op vrijdag 12 mei 2006 @ 14:19:
Sim-pel

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

$i = 1;  //met 1 beginnen, anders miss delen door 0
$perrow = 10; //hoeveel per rij/pagina?

$query = mysql_query("SELECT id FROM tabel WHERE id <= 22");

while($r = mysql_fetch_row($query))
{
     if($r[0] == "22")
     {
          $row = ceil($i / $perrow);
          break;
     }
     $i++;
}
?>


Lijkt mij wel te gaan werken? :)
Waarom niet meteen een COUNT() in de query? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Acolyte
  • Registratie: Oktober 2002
  • Laatst online: 28-08-2024

Acolyte

Lid

-NMe- schreef op vrijdag 12 mei 2006 @ 14:45:
[...]

Waarom niet meteen een COUNT() in de query? ;)
Nou, ik zal eerlijk zijn. Ik weet niet hoe count werkt in mysql queries, en aangezien TS nog niet aangaf het nu te snappen / zijn antwoord te hebben dacht ik, ik probeer het op een andere manier te benaderen ;)

Acties:
  • 0 Henk 'm!

  • Kayshin
  • Registratie: Juni 2004
  • Laatst online: 09-03-2018

Kayshin

Bl@@T @@P!!!

Acolyte schreef op vrijdag 12 mei 2006 @ 14:52:
[...]

Nou, ik zal eerlijk zijn. Ik weet niet hoe count werkt in mysql queries, en aangezien TS nog niet aangaf het nu te snappen / zijn antwoord te hebben dacht ik, ik probeer het op een andere manier te benaderen ;)
http://dev.mysql.com/doc/refman/5.0/en/counting-rows.html ;)

My personal videoteek: -Clique-; -NMe- is een snol!


Acties:
  • 0 Henk 'm!

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 19:46
ik heb hem eindelijk goed :)
thnx!

hier hoe ik het heb gedaan:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function ForumGetPagina($reply_ID,$topic_ID)
{
    global $perpagina;
    $sql = "SELECT  COUNT(*) AS aantal
            FROM    lm_f_replies
            WHERE   ID < '".$reply_ID."' AND
                       topic_ID = '".$topic_ID."'";
    $resultaat = mysql_query($sql)or die(mysql_error());
    while($record = mysql_fetch_array($resultaat))
        $aantal = $record['aantal'];
    $paginanummer = $aantal / $perpagina;

    return ceil($paginanummer);
}

[ Voor 19% gewijzigd door Scotix op 12-05-2006 15:21 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Scotix schreef op vrijdag 12 mei 2006 @ 15:20:
ik heb hem eindelijk goed :)
thnx!

hier hoe ik het heb gedaan:
PHP:
1
...
2 dingen:
1. Als je maar een veld ophaalt hoef je niet door een resultset te loopen :)
2. Je kunt de deling ook prima in de query uitvoeren:
PHP:
1
2
3
4
5
6
$sql = "SELECT CEIL( COUNT(*) / " .$perpagina .")
            FROM    lm_f_replies
            WHERE   ID < '".$reply_ID."' AND
                       topic_ID = '".$topic_ID."'";
$resultaat = mysql_query($sql)or die(mysql_error());
$pagina = mysql_fetch_field($resultaat, 0, 0);

[ Voor 7% gewijzigd door T-MOB op 12-05-2006 16:04 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 19:50

Gonadan

Admin Beeld & Geluid, Harde Waren
JeRa schreef op vrijdag 12 mei 2006 @ 14:43:
[...]

offtopic:
Was een retort richting Gonadan die duidelijk aan het zeiken was op MySQL, en in veel gevallen zijn dat postgresfanboys.
offtopic:
Dat intpreteer jij als zeiken? :S

Ik gebruik zelf ook altijd mySQL


@TS:
Waarom doe je niet zoiets:
haal het paginanummer uit je get-array.
trek daar 1 van af
vermenigvuldigen met 10
en dan limit gebuiken
komt hier op neer: LIMIT(10*($_GET['pagina']-1), 10)
Zo maak ik zelf m'n pagina's. :)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8

Pagina: 1