Tolong pilih kategori sesuai, jenis posting (pertanyaan atau bukan) dan sertakan tag/topik yang sesuai misal komputer, php, mysql, dll.
Promosi atau posting tidak pada tempatnya akan kami hapus.
Mencantumkan kode program di posting Anda, tolong ikuti aturan yang sesuai, baca http://diskusiweb.com/discussion/39204/aturan-cara-menyisipkan-kode-program-di-diskusiweb

Baca cara posting gambar/image di post Anda: http://www.diskusiweb.com/discussion/47345/cara-menyisipkan-menyertakan-image-pada-posting/p1

Paging PHP + MySQL

"... halah, standar ... apaan sih ? ..."  :D
mungkin itu ya yg ada dipikiran anda ?

saya juga baru baca hari ini, padahal dokumentasinya ada di MySQL dari jaman MySQL 4.0.0
dan memang sudah terbiasa bikin paging dengan "metode umum", kombinasi COUNT() dan SELECT
cara yg baru saya baca ini diluaran juga sudah ada yg pakai & buat,
(saya tidak explore / mencari / nyontek ... dasar saya pure manual MySQL)

baca dokumentasi MySQL, uji coba bentar, VOILA !

wordpress juga pakai cara ini, tapi user mungkin hanya sekedar pakai tanpa sadar :D

then, story begin ...

http://dev.mysql.com/doc/refman/5.5/en/select.html
http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_found-rows

table dasar uji coba :
CREATE TABLE `test` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
`string` VARCHAR(5) NOT NULL ,
PRIMARY KEY (`id`)
);


script PHP, isi table dasar dengan 96 data random :
<?php
mysql_connect( 'localhost' , 'mysql_user' , 'mysql_password' );
mysql_select_db( 'test' );
$num=96;
$values=array();
for($i=0;$i<$num;$i++) {
$values[]=rand(1000,9999);
}
mysql_query( 'INSERT INTO `test` (`string`) VALUES ("' . implode( '"),("' , $values ) . '")' );
echo 'DONE, ' . $num . ' rows inserted !';
?>


[Cara 1] Kombinasi COUNT() dan SELECT
<?php
mysql_connect( 'localhost' , 'mysql_user' , 'mysql_password' );
mysql_select_db( 'test' );
 
$per_page=10;
$total_querytime=0;
 
$page=isset($_GET['p'])?(int)$_GET['p']:1;
if($page<1) $page=1;
$offset=($page-1)*$per_page;
 
$starttime=microtime();
$sql=mysql_query( 'SELECT `id`,`string` FROM `test` LIMIT '.$offset.','.$per_page );
$total_record=mysql_query( 'SELECT COUNT(`id`) AS rows FROM `test`' );
$endtime=microtime();
$total_querytime=$total_querytime+($endtime-$starttime);
$total_record=mysql_fetch_array($total_record);
$total_record=$total_record['rows'];
 
$total_page=ceil($total_record/$per_page);
if($page>$total_page) $page=$total_page;
 
echo 'page : <select onchange="window.location=\'?p=\'+this.value">';
for($i=1;$i<=$total_page;$i++) echo '<option' . ( $i==$page ? ' selected' : '' ) . '>' . $i . '</option>';
echo '</select><br>';
echo 'ID | RANDOM<br>';
echo '-----------<br>';
while( $row=mysql_fetch_array($sql) ) echo sprintf( '%s | %s<br>' , $row['id'] , $row['string'] );
echo '-----------<br>';
echo '(' . round( $total_querytime , 8 ) . ' seconds)';
?>


[Cara 2] SQL_CALC_FOUND_ROWS
<?php
mysql_connect( 'localhost' , 'mysql_user' , 'mysql_password' );
mysql_select_db( 'test' );
 
$per_page=10;
$total_querytime=0;
 
$page=isset($_GET['p'])?(int)$_GET['p']:1;
if($page<1) $page=1;
$offset=($page-1)*$per_page;
 
$starttime=microtime();
$sql=mysql_query( 'SELECT SQL_CALC_FOUND_ROWS `id`,`string` FROM `test` LIMIT '.$offset.','.$per_page );
$total_record=mysql_query( 'SELECT FOUND_ROWS() AS rows' );
$endtime=microtime();
$total_querytime=$total_querytime+($endtime-$starttime);
$total_record=mysql_fetch_array($total_record);
$total_record=$total_record['rows'];
 
$total_page=ceil($total_record/$per_page);
if($page>$total_page) $page=$total_page;
 
echo 'page : <select onchange="window.location=\'?p=\'+this.value">';
for($i=1;$i<=$total_page;$i++) echo '<option' . ( $i==$page ? ' selected' : '' ) . '>' . $i . '</option>';
echo '</select><br>';
echo 'ID | RANDOM<br>';
echo '-----------<br>';
while( $row=mysql_fetch_array($sql) ) echo sprintf( '%s | %s<br>' , $row['id'] , $row['string'] );
echo '-----------<br>';
echo '(' . round( $total_querytime , 8 ) . ' seconds)';
?>


paging ini hanya berlaku jika database yang dipakai MySQL
karena yang saya pakai spesifik pakai keyword dan fungsi MySQL


beda cara 1 dan 2 apa ?
beda cara memperoleh jumlah total record,
total record berguna untuk menghitung batas akhir jumlah halaman
cara 1, menggunakan COUNT()
cara 2, sembari query LIMIT sekaligus menghitung jumlah total record

performance ?
http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows
http://phpdevblog.niknovo.com/2009/06/mysql-pagination-sql-calc-found-rows-vs-count-query.html

uji coba di PC AMD quad core saya secara manual, script di atas cenderung lebih cepat SQL_CALC_FOUND_ROWS
belum uji coba dengan jmeter, cakupan data ribuan atau lebih

banyak kasus, terutama dengan kondisi query SELECT sederhana :
lebih cepat kombinasi COUNT() + SELECT

beberapa kasus dengan query SELECT yang kompleks dan melibatkan banyak JOIN + kondisi WHERE dan HAVING (koding aplikasi skala besar tidak mungkin menghindari hal ini) :
lebih cepat SQL_CALC_FOUND_ROWS

tidak menyarankan meninggalkan metode umum
tidak pula menyarankan mengabaikan penggunaan SQL_CALC_FOUND_ROWS
tergantung kasus per kasus

Tanggapan

  • edited December 2012
    testing with jmeter

    - 50 concurrent users
    - 30 records per page
    - 100 times random request page @ 1-5249
    - 157.469 records

    hasil relatif sama : result diterima rata-rata 99 ms
  • Jempol buat pak dot, kasi tutorial ciamik hehehe
  • edited May 2014
    kalau untuk output array seperti mah googog kaya gmna yah mastah??
  • output array kaya apa ?
    dari mana asal nya ?
  • edited May 2014
    maksudku ini kan yang di jelasin mastah . [dot] berbentuk listbox untuk paginasinya ..
    kalo seandainya berbentuk paginasi seperti (Page : 1,2,3,4,5 >> Last) ini apa yang harus diganti mastah gajah?? maklumi merepotkan masih newbie
  • kalo cuma masalah tampilan daftar halaman dalam bentuk combo atau link <a> atau button
    kagak ada bedanya to mas ...

    itu cuma masalah tampilan
    bukan masalah pengolahan data nya
  • edited May 2014
    mastah gajah seaindainya aku mau membuat tampilan daftar (Page : 1 2 3 ... 10 Next>>) sesuai codingan dari mastah .[dot] diatas .. untuk tampilan daftarnya aku ganti seperti dibawah ini apakah masih ada kekurangan atau celah eror ?? mohon penilaiannya (maaf merepotkan maklumi newbie QQ)

    <pre lang='php'>
    $showhalaman = isset($_GET['showhalaman'])? $_GET['showhalaman']:'';
    if ($page > 1){
    echo  "<a href='".$_SERVER['PHP_SELF']."?page=".($page-1)." '>&lt;&lt; Prev</a>";
    }
    for($i=1;$i<=$total_page;$i++)
    {
    if ((($i >= $page - 2) && ($i <= $page + 2)) || ($i == 1) || ($i == $total_page))
    {
    if (($showhalaman == 1) && ($i != 2))
    {
    echo "...";
    }
    if (($showhalaman != ($total_page - 1)) && ($i == $total_page))
    {
    echo "...";
    }
    if ($i == $page)
    {
    echo " <b>".$i."</b> ";
    }
    else
    {
    echo " <a href='".$_SERVER['PHP_SELF']."?page=".$i."'>".$i."</a> ";
    }
    $showhalaman = $i;
    }
    }
    if ($page < $total_page)
    {
    echo "<a href='".$_SERVER['PHP_SELF']."?page=".($page+1)."'>Next &gt;&gt;</a>";
    }
    </pre>
  • edited May 2014
    susunan angkanya dulu ...
    mau nya spt apa ?

    soalnya bentuk angka berurut buat page itu macem-macem

    misal halaman 1-100, current page 50

    ada yg begini (ada jump ke halaman, tapi bukan +/- 1, contohnya lompat 10) :
    First | Prev | 30 40 48 49 [50] 51 52 60 70 | Next | Last
    alternatif lain : << | < | 30 40 48 49 [50] 51 52 60 70 | > | >>
    alternatif lain : Prev | 1 30 40 48 49 [50] 51 52 60 70 100 | Next

    ada yg begini :
    First | Prev | 46 47 48 49 [50] 51 52 53 54 | Next | Last

    atau begini :
    First | Prev | -10 | -5 | 48 49 [50] 51 52 | +5 | +10 | Next | Last

    tapi kalo begini ya kebangetan :
    1 | 2 | 3 | 4 | ... terus ... | 48 | 49 | [50] | 51 | 52 | ... dan terus ditulis lengkap ... sampai ... | 98 | 99 | 100
  • edited June 2014
    mastah klo permasalahnya seperti ini bagaimana memecahkannya yah??

    kalo file index.php otomatis kita klik paginasinya akan tambah di address bar seperti ini :
    harusbaca.com/index.php?page=bla..

    tapi kalo filenya request'n index.php?id=1&tester otomatis kita klik paginasinya bukannya tambah malah kurang di address bar seperti ini :
    harusbaca.com/index.php?page=bla.. bukannya index.php?id=1&tester?page=bla..

    ini sebabnya kenapa yah master kalo menggunakan script paginasi diatas??
  • ya dilihat cara koding elo membuat link href nya
  • edited June 2014
    apakah tidak ada cara lain mastah hanya untuk menambah ?page=bla.. diujung link harusbaca.com/index.php?id=1&tester ??

    seperti $_SERVER['PHP_SELF'] memanggil harusbaca.com/index.php, sedangkan menggunakan $_SERVER['PHP_SELF'] ketinggalan ?id=1&tester  nya dan langsung bablas ke harusbaca.com/index.php?page=bla.. bukannya harusbaca.com/index.php?index.php?id=1&tester?page=bla.. karena kodingan menampilkan paginasinya banyak percabangan :((
  • mau koreksi script pan mesti lihat koding nya mas ...
  • edited June 2014
    aku pakai koding yang di atas mastah (#Item_9) untuk menampilkan paginasinya dan menghitung banyaknya data menggunakan kodingan mastah .[dot] cara ke 2 (klo di paparin ulang takut spam mastah)
  • ini ?

    echo  "<a href='".$_SERVER['PHP_SELF']."?page=".($page-1)." '>&lt;&lt; Prev</a>";

    coba persis di atas nya elo tambah :

    print_r($_GET)

    posting kemari yg tercetak
  • iyaa mastah kan disitu ada 3 link hrefnya
    1. echo  "<a href='".$_SERVER['PHP_SELF']."?page=".($page-1)." '>&lt;&lt; Prev</a>";

    2. echo " <a href='".$_SERVER['PHP_SELF']."?page=".$i."'>".$i."</a> ";

    3. echo "<a href='".$_SERVER['PHP_SELF']."?page=".($page+1)."'>Next &gt;&gt;</a>";

    taruh print_r($_GET) persis diatas link href

    echo  "<a href='".$_SERVER['PHP_SELF']."?page=".($page-1)." '>&lt;&lt; Prev</a>"; ??
  • edited June 2014
    iya ...

    atau gini aja dah
    tuh "page" di GET paling juga sudah kagak dipake lagi value nya ...

    satu contoh :

    if ($page > 1){
    $_GET['page']=$page-1;
    echo  "<a href='".$_SERVER['PHP_SELF']."?".http_build_query($_GET)." '>&lt;&lt; Prev</a>";
    }

    lainnya, beresin sendiri ...
  • edited June 2014
    terima kasih banyak mastah gajah i love youu pulll :x :x
  • kalau di saya search query itu di tabel dan setelah klik tombol.
    gimana tuh gabunginnya ? 
    saya udah coba berkali2 tutor disini + google tapi gagal terus 
  • koding posting kemari
  • edited June 2014
    agak panjang nih kodingnya :D

    <pre lang="php">

    <table width="734" border='0' align='center'>
    <tr bgcolor=#ADFF2F><th width="34">No</th><th width="97">Tanggal</th><th width="88">AGENID</th><th width="71">Nominal</th><th width="129">Nomor</th><th width="81">Status</th><th width="220">VSN</th>

    <?php
    include 'koneksi.php';

    if (isset($_POST['tcari'])) {

    $from = $_POST["dp1"];
    $to = $_POST["dp2"];


    $query = "SELECT * from log_transaksi where tanggal >= DATE_FORMAT('" . $from . "', '%Y-%m-%d') AND tanggal <= DATE_FORMAT('" . $to . "', '%Y-%m-%d') AND agenid ='$agenid' ORDER BY tanggal,jam ASC ";
    $exe = mysql_query($query);
    $no = 1;
    $baru = "#FFFF00";
    $lama="#FFFF00";
    while($row = mysql_fetch_assoc($exe)){

    $a = $row['tanggal'];
    $b = $row['jam'];
    $c = $row['agenid'];
    $d = $row['denom'];
    $e = $row['nomor'];
    $f = $row['harga'];
    $g = $row['status'];
    $h = $row['vsn'];


    // beri warna selang seling
    if(($no % 2)==0)$warna = $baru;

    else $warna = $lama;


    echo "<tr bgcolor=$warna align=center>
    <td>$no</td>
    <td>$a<br>$b</td>
    <td>$c</td>
    <td bgcolor=blue>$d<br>$f</td>
    <td>$e</td>
    <td>$g</td>
    <td>$h</td>
    </tr>";
    $no++;


    }}
    ?>


    </table>


    </form>

    </body>
    </html>

    < /pre>
  • $agenid=$_SESSION['agenid'];
    if(session_is_registered('agenid'))

    kagak perlu ... itu sudah deprecated

    cukup :

    $agenid=isset($_SESSION['agenid'])?$_SESSION['agenid']:-1;
    if($agenid!=-1)



    perhatikan ini :

    SELECT *
    from log_transaksi
    where
      tanggal >= DATE_FORMAT('" . $from . "', '%Y-%m-%d') AND
      tanggal <=  DATE_FORMAT('" . $to . "', '%Y-%m-%d') AND
      agenid ='$agenid'
    ORDER BY tanggal,jam ASC

    $from dan $to asalnya dari :
    $from = $_POST["dp1"];
    $to = $_POST["dp2"];

    2-2 nya POST
    kalo mau di paging, 2-2 nya ikutkan ke GET
    atau elo simpan di SESSION

    jadi bisa elo pake di halaman selanjutnya
  • saya bingungnya script page di taruh sebelum klik tombol / sesudahnya ?kan koding search sy baru jalan kalau di klik tombol cari.
  • maksudnya bagaimana ?

    form pencarian :
    cari : [________________] [Cari]

    script pencarian :
    < prev | ... | next >

    [tampilan hasil pencarian]
    1 | ...
    2 | ...
    3 | ...

    pan begitu modelnya
  • di atas kan script page sebelum query search.
    saya pernah coba2 sdh keluar nomor page tp pas di klik kosong aja.
  • ini maksudnya koding yg mana ?
  • mau jawab kodingnya selalu characters too long :(
  • kirim ke pastebin.org
    posting kemari url nya
  • <form> search nya, posting kemari
  • <form method="post" action="transaksi.php">

    ganti jadi GET
  • edited June 2014
    di ganti get malah gak jalan fungsi tombolnya  :-/

    udah diganti script 

    $from = $_GET['dp1'];
    $to = $_GET['dp2'];
  • koding pencarian sudah diubah jadi kaya apa ?
  • jadi kayak gini http://pastebin.com/91wxi7dt

    paging nya gak nyontoh disini
  • <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
    <script src="//code.jquery.com/jquery-1.10.2.js"></script>
    <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
    <link rel="stylesheet" href="/resources/demos/style.css">

    <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
    <script src="//code.jquery.com/jquery-1.10.2.js"></script>
    <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
    <link rel="stylesheet" href="/resources/demos/style.css">

    itu dipanggil berulang kali buat apa ya ?



    if (isset($_POST['tcari'])) {

    gimana mau jalan kalo tetep pake POST ?
  • saya taunya tombol pasti pakai post :D 

    tu buat 2x karena kalau 1x yang dp2 gak mau keluar tanggalnya.
    jadi serasa text field 
  • edited June 2014
    yg bilang kagak jalan siapa ? :D

    <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
    <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
    <script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
    <script>
    $(function() {
      $( "#datepicker" ).datepicker({ dateFormat: 'yy-mm-dd' }).val();
      $( "#datepicker2" ).datepicker({ dateFormat: 'yy-mm-dd' }).val();
    });
    </script>

    Dari:<input type="text" id="datepicker" name="dp1">
    Sampai:<input type="text" id="datepicker2" name="dp2">
  • hasil coba sendiri gak jalan makanya tak buat 2 aja sekalian  :-))

    ============================
    ternyata bisa di persingkat ya di masukan ke function 
  • Permisi Semua para master programer.....
    ane mau tanya, ane ada bikin program web dengan PHP+MYSQL email alert, kadang pemberitahuan masuk ke email kadang gak masuk ke email (ilung.deso@gmail.com) tolong bantuannya??
  • bisa baca to mas tret ini topiknya ttg apa ?

    apa susahnya bikin tret baru ?
  • edited October 2014
    Maaf kalo saya singgung2 lagi trit lama.

    Pak Boo, di cara 1 dan 2 ada baris:
    $total_page=ceil($total_record/$per_page);
    if($page&gt;$total_page) $page=$total_page;


    Itu sebenernya buat apa ya?

    Sekalian mo nanya, saya coba praktekin cara kedua. Misalkan perhitungan hasil query, total page = 13 page.
    Kalo user minta page 20, pengennya ditampilin data untuk page terakhir yang masih mungkin (page 13) tp saya bingung logicnya.

    Kalo pake cara 1 sih, saya bisa SELECT COUNT dulu, hitung offset dan total page, baru query SELECT yang sebenarnya.
  • edited October 2014
    ini :
    $total_page=ceil($total_record/$per_page);
    if($page>$total_page) $page=$total_page;

    ada semua di 2 cara

    misal, elo punya table yg mau ditampilkan,
    isinya 32 record
    per halaman elo rencanakan tampil 10 record

    jadi bakal ada : 10 + 10 + 10 + 2 ... 4 halaman

    $per_page itu 10 nya, jumlah record per halaman yg mau ditampilkan
    $total_record itu 32 record yg ada di table
    ceil() itu fungsi pembulatan ke atas php

    $total_page = ceil( $total_record / $per_page )
    $total_page = ceil( 32 / 10 )
    $total_page = ceil( 3.2 )
    $total_page = 4 ... total jumlah halaman yg ada



    if($page>$total_page) $page=$total_page;

    $page itu halaman yg diminta utk dibuka
    asalnya dari : $page=isset($_GET['p'])?(int)$_GET['p']:1;
    contoh di atas, request halaman lewat GET, parameter nya "p"

    misal minta dibuka halaman 3
    script.php?p=3

    $page=isset($_GET['p'])?(int)$_GET['p']:1;

    $page = kalo GET "p" ada, ambil GET "p" sekalian ubah jadi integer
    tapi kalo GET "p" tidak ada, $page isi 1, buka halaman 1

    if($page<1) $page=1;
    kalo $page kurang dari 1, tetap buka halaman 1

    if($page>$total_page) $page=$total_page;
    if( 3 > 4 ) $page = 4 ... $page tetep 3, soalnya $page belum melebihi total jumlah halaman

    tapi kalo meminta dibuka halaman 10 (kagak ada, jumlah halaman cuma 4)
    if( 10 > 4 ) $page = 4 ... $page jadi 4, yg dibuka tetep halaman terakhir, halaman 4
    $total_page=ceil($total_record/$per_page);
    if($page&gt;$total_page) $page=$total_page;

    Sekalian mo nanya, saya coba praktekin cara kedua. Misalkan perhitungan hasil query, total page = 13 page.
    Kalo user minta page 20, pengennya ditampilin data untuk page terakhir yang masih mungkin (page 13) tp saya bingung logicnya.
    sudah gak ada masalah to ?
    itu ya baris : if($page>$total_page) $page=$total_page; yg elo tanyain



    beda 2 cara itu cuma beda cara untuk memperoleh $total_record nya, tapi hasilnya sama
    buat dasar menghitung $total_page

    kalo elo baca yg ini :
    http://www.diskusiweb.com/discussion/46128/mysql-query-performance/p1
    query nya sudah kompleks

    pake SQL_CALC_FOUND_ROWS bisa memangkas waktu query sampai setengahnya

    kenapa bisa ?
    kalo elo pake COUNT(), elo bakal menjalankan query yg kompleks itu 2x
    1x utk COUNT
    1x utk ambil data

    tapi kalo pake SQL_CALC_FOUND_ROWS, query kompleks nya cuma dijalankan 1x
    $total_record bisa elo ambil pake

    $total_record=mysql_query( 'SELECT FOUND_ROWS() AS rows' );
    $total_record=mysql_fetch_array($total_record);
    $total_record=$total_record['rows'];



    sudah jelas ?
  • edited October 2014
    Maaf, penjelasan dari pak Udang udah paham tp yang saya tanyain masih belom.


    per_page = 10
    total record = belom tau
    page = 10 (hasil dari $_GET)
    offset = (page-1) x per_page = (10-1) x 10 = 9 x 10 = 90


    querynya:
    SELECT SQL_CALC_FOUND_ROWS * FROM test LIMIT 90, 10


    Hasil querynya = zero result.
    Karena offsetnya gak bener (data ada 32, tp offset = 90)


    Nah....maksud saya, kalo user minta halaman 10, gak ada data yang ditampilin meski nilai page-nya bener (hasil if (page > total_page). Sedangkan saya pengennya ditampilkan data untuk halaman 4 (nilai page terbesar yang masih mungkin).


    Kalo pake cara 1, saya bisa tulis PHP kayak gini.
    $p = isset($_GET['p']) ? (int) $_GET['p'] : 1;
    if ($p < 1) $p = 1;
     
    $per_page = 10;
    $total_record = mysql_fetch_array(mysql_query('SELECT COUNT(id) AS rows FROM test'))['rows'];
     
    $total_page = ceil($total_page / $per_page);
     
    // nah di sini saya bisa validasi ulang page yang diminta, kalo2 ada user minta halaman &gt; total page
    if ($p > $total_page) $p = $total_page;
     
    // karena nilai page udah dvalidasi, baru ngitung offset
    $offset = ($page - 1) * $per_page;
     
    $data = mysql_query("SELECT * FROM test LIMIT $offset, $per_page ");


    Maaf, kalo pak Udang jadi direpotkan.
  • o, itu ...

    tetep pake SQL_CALC_FOUND_ROWS
    bagian ini aja elo ubah :

    if ($page > $total_page) {
      $page = $total_page;
      $offset = ($page - 1) * $per_page;
      $data = mysql_query("SELECT * FROM test LIMIT $offset, $per_page ");
    }

    query pengecualian yg ambil ulang itu di eksekusi jika $page melebihi batas
    tetep lebih cepat, karena yg pengecualian di eksekusi kalo yg buka halaman iseng ketik url manual
    dan itu kagak bakal sering, karena buka halaman pasti sudah ada link nya

    kalo query sdh kompleks
    minimal, kecepatannya sama dgn yg pake COUNT()
    2x mengeksekusi query yg kompleks
  • Oohhh gitu... Maturnuwun, Pak.
Sign In or Register to comment.