Coba salah satu kueri berikut:
SELECT a.phone_no
FROM admission a
JOIN users u on a.phone_no LIKE concat(u.phone_no, '__')
WHERE u.phone_no REGEXP '^(99)+[0-9]+$'
atau
SELECT a.phone_no
FROM admission a
JOIN users u on a.phone_no REGEXP concat('^', u.phone_no, '[0-9]{2}$')
WHERE u.phone_no REGEXP '^(99)+[0-9]+$'
Jika jumlah "digit akhir" tidak tetap, Anda juga dapat menggunakan:
LIKE concat(u.phone_no, '%')
atau
REGEXP concat('^', u.phone_no, '[0-9]*$')
Tetapi dalam hal ini Anda mungkin perlu menggunakan SELECT DISTICT a.phone_no
jika mungkin users.phone_no
adalah turunan dari users.phone_no
lainnya (mis. 99123 dan 991234).
Perbarui
Setelah menjalankan beberapa tes dengan 10 ribu baris untuk tabel pengguna dan 100 ribu baris untuk tabel masuk, saya sampai pada pertanyaan berikut:
SELECT a.phone_no
FROM admission a
JOIN users u
ON a.phone_no >= u.phone_no
AND a.phone_no < CONCAT(u.phone_no, 'z')
AND a.phone_no LIKE CONCAT(u.phone_no, '%')
AND a.phone_no REGEXP CONCAT('^', u.phone_no, '[0-9]*$')
WHERE u.phone_no LIKE '99%'
AND u.phone_no REGEXP '^(99)+[0-9]*$'
UNION SELECT 0 FROM (SELECT 0) dummy WHERE 0
Dengan cara ini Anda dapat menggunakan REGEXP
dan masih memiliki performa yang bagus. Kueri ini dijalankan hampir seketika dalam kasus pengujian saya.
Logikanya Anda hanya membutuhkan kondisi REGEXP. Tetapi pada tabel yang lebih besar, kueri mungkin kehabisan waktu. Menggunakan kondisi LIKE akan memfilter hasil yang ditetapkan sebelum pemeriksaan REGEXP. Tetapi bahkan menggunakan LIKE, kueri tidak berfungsi dengan baik. Untuk beberapa alasan MySQL tidak menggunakan pemeriksaan jangkauan untuk bergabung. Jadi saya menambahkan pemeriksaan rentang eksplisit:
ON a.phone_no >= u.phone_no
AND a.phone_no < CONCAT(u.phone_no, 'z')
Dengan pemeriksaan ini Anda dapat menghapus kondisi LIKE dari bagian JOIN.
Bagian UNION adalah pengganti DISTICT. MySQL tampaknya menerjemahkan DISTINCT menjadi pernyataan GROUP BY, yang tidak berkinerja baik. Menggunakan UNION dengan set hasil kosong saya memaksa MySQL untuk menghapus duplikat setelah SELECT. Anda dapat menghapus baris itu, jika Anda menggunakan jumlah digit akhir yang tetap.
Anda dapat menyesuaikan pola REGEXP dengan kebutuhan Anda:
...
AND a.phone_no REGEXP CONCAT('^', u.phone_no, '[0-9]{2}$')
...
AND u.phone_no REGEXP '^(99)+[0-9]{8}$'
...
Jika Anda hanya membutuhkan REGEXP untuk memeriksa panjang phone_no, Anda juga dapat menggunakan kondisi LIKE dengan placeholder '_'.
AND a.phone_no LIKE CONCAT(u.phone_no, '__')
...
AND u.phone_no LIKE '99________$'
atau gabungkan kondisi LIKE dengan tanda STR_LENGTH.