Pertanyaan Apakah ada cara yang lebih baik untuk membuat indeks paginasi abjad di PHP / MySQL?


Salah satu perilaku standar saya untuk paginasi dalam CMS saya adalah menampilkan bilah cepat alfabet ketika menyortir berdasarkan kolom alfa. Misalnya, jika hasil diurutkan berdasarkan Nama Belakang, di bawah paginasi saya menampilkan serangkaian tautan, A sampai Z, untuk membawa Anda langsung ke laman untuk karakter pertama tertentu.

Contoh:

Saat ini saya melakukan ini dengan mendapatkan semua hasil untuk kolom itu, diurutkan berdasarkan abjad, dan kemudian membolak-baliknya semuanya dalam PHP dan merekam halaman apa yang muncul di catatan. Ini berfungsi dengan baik ketika Anda hanya berurusan dengan beberapa ratus hasil, tapi saya sekarang bekerja pada proyek yang berpotensi memiliki beberapa ratus ribu baris dan itu bukan pilihan yang layak.

Apakah ada metode yang lebih efisien untuk menghasilkan indeks semacam ini? Perhatikan bahwa itu juga perlu menangani lebih dari sekadar A-Z, karena baris dapat dimulai dengan angka atau tanda baca.

Edit untuk klarifikasi: Saya tidak mencari daftar sederhana dari semua karakter pertama, itu mudah. Saya perlu menghitung halaman berapa dari total hasil yang dimulai dengan karakter itu akan aktif. Jadi katakanlah kami mencari seseorang bernama Walter, dan saya memiliki 1000 baris, saya perlu tahu di mana dalam kisaran 1-1000 awal W itu.


7
2017-07-05 20:26


asal


Jawaban:


Saya menganggap itu bidang varchar, jadi apakah Anda mempertimbangkan hal berikut:

SELECT DISTINCT SUBSTRING(lastname FROM 1 FOR 1) FROM mytable;

Ini akan memberi Anda daftar berbeda dari huruf pertama dari nama belakang.

Anda juga dapat menggunakan UPPER () untuk memastikan Anda hanya mendapatkan karakter huruf besar. LEFT () juga akan mencapai sesuatu yang serupa, jadi Anda harus bereksperimen untuk melihat mana yang bekerja paling cepat pada dataset Anda.

Sunting: Jika Anda juga ingin jumlah:

SELECT DISTINCT SUBSTRING(lastname FROM 1 FOR 1) AS firstletter, COUNT(*) AS counter FROM mytable GROUP BY firstletter;

Tidak perlu melakukan query kedua untuk setiap huruf.


8
2017-07-05 20:34



$sql = "SELECT left(name, 1) AS firstchar FROM mytable ORDER BY name";

$result = mysql_query($sql) or die(mysql_error());

$letters = array();
$row = 0;
while($row = mysql_fetch_assoc($result)) {
    $row++;
    if (!isset($letters[$row['firstchar']])) {
        $letters[$row['firstchar']] = $row;
    }
}

Ini akan memberi Anda sebuah array yang dikunci oleh huruf pertama, dan nomor baris yang pertama kali mereka kemukakan untuk nilainya:

a => 1,
b => 50,
c => 51,

dll ...

Mungkin ada beberapa cara untuk melakukannya murni dalam SQL, tetapi MySQL sendiri tidak memiliki dukungan 'nomor baris' yang dibangun, jadi itu akan menjadi permintaan yang sangat jelek.


1
2017-07-05 20:48



Sama seperti pada pagination standrd hanya masalah mengambil dan memesan - cukup tambahkan WHERE dengan A% (jangan lupa untuk membuat indeks pada kolom ini)


0
2017-07-05 20:32



<?php
$result1 = mysql_query("SELECT LEFT(name, 1) AS fl FROM comics GROUP BY fl");
while ($row = mysql_fetch_array($result1))
{
$result11 = mysql_query("SELECT * FROM comics WHERE name LIKE '".$row['fl']."%'");
$countresult11 = mysql_num_rows($result11);
?>
<a href="?sort=<?php echo $row['fl']; ?>" title="<?php echo $countresult11; ?> Comics"><?php echo $row['fl']; ?></a>&nbsp;    
<?php } ?>

mungkin agak apa yang Anda cari jika Anda mengganti variabel saya / nama tabel dengan Anda.

yang akan memeriksa tabel, tarik huruf pertama dari masing-masing, kelompok dengan huruf itu dan outputkan sebagai

1 3 7 9 A B R W X Y Z

tergantung pada apa yang Anda miliki di meja


0
2017-07-05 20:32