Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menggunakan regexp pada hasil sub kueri?

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

biola

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL menunjukkan baris yang salah saat menggunakan GROUP BY

  2. Saya memiliki array bilangan bulat, bagaimana cara menggunakan masing-masing dalam kueri mysql (dalam php)?

  3. Permintaan Python dan MySQL dengan tanda kutip

  4. Pisahkan versi situs web yang berbeda

  5. sisipan php mysql (maks(id)+1)