Jadual Kandungan
Cara Mengira Persamaan Rentetan dalam MySQL
Pelaksanaan menggunakan Fungsi MySQL
Mengira Peratusan Kesamaan
Rumah pangkalan data tutorial mysql Bagaimana untuk Mengira Peratusan Kesamaan Rentetan dengan Cekap dalam MySQL?

Bagaimana untuk Mengira Peratusan Kesamaan Rentetan dengan Cekap dalam MySQL?

Dec 03, 2024 pm 09:49 PM

How to Efficiently Calculate String Similarity Percentage in MySQL?

Cara Mengira Persamaan Rentetan dalam MySQL

Untuk menentukan persamaan antara dua rentetan yang disimpan dalam MySQL, pertimbangkan untuk menggunakan algoritma yang cekap seperti jarak Levenshtein. Pendekatan ini mengira bilangan suntingan satu aksara (penambahan, penyingkiran atau penggantian) yang diperlukan untuk mengubah satu rentetan kepada rentetan yang lain.

Pelaksanaan menggunakan Fungsi MySQL

MySQL menyediakan satu siri fungsi untuk rentetan manipulasi. Berikut ialah contoh fungsi (levenshtein) yang mengira jarak Levenshtein antara dua rentetan, s1 dan s2:

CREATE FUNCTION `levenshtein`(s1 text, s2 text) RETURNS int(11)
DETERMINISTIC
BEGIN
  # Initialize variables
  DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
  DECLARE s1_char CHAR;
  DECLARE cv0, cv1 text;
  SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2),
    cv1 = 0x00, j = 1, i = 1, c = 0;

  # Check for edge cases
  IF s1 = s2 THEN
    RETURN 0;
  ELSEIF s1_len = 0 THEN
    RETURN s2_len;
  ELSEIF s2_len = 0 THEN
    RETURN s1_len;
  ELSE
    # Main loop over s1 characters
    WHILE j <= s2_len DO
      SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
    END WHILE;

    WHILE i <= s1_len DO
      SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)),
        j = 1;

      # Inner loop over s2 characters
      WHILE j <= s2_len DO
        SET c = c + 1;
        IF s1_char = SUBSTRING(s2, j, 1) THEN
          SET cost = 0;
        ELSE
          SET cost = 1;
        END IF;

        SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
        IF c > c_temp THEN SET c = c_temp; END IF;
        SET c_temp = CONV(HEX(SUBSTRING(cv1, j + 1, 1)), 16, 10) + 1;
        IF c > c_temp THEN SET c = c_temp; END IF;
        SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
      END WHILE;

      SET cv1 = cv0, i = i + 1;
    END WHILE;
  END IF;

  # Return Levenshtein distance
  RETURN c;
END
Salin selepas log masuk

Mengira Peratusan Kesamaan

Dengan jarak Levenshtein yang dikira, anda boleh mengira peratusan persamaan seperti berikut:

CREATE FUNCTION `levenshtein_ratio`(s1 text, s2 text) RETURNS int(11)
DETERMINISTIC
BEGIN
  DECLARE s1_len, s2_len, max_len INT;
  SET s1_len = LENGTH(s1), s2_len = LENGTH(s2);
  IF s1_len > s2_len THEN
    SET max_len = s1_len;
  ELSE
    SET max_len = s2_len;
  END IF;
  RETURN ROUND((1 - LEVENSHTEIN(s1, s2) / max_len) * 100);
END
Salin selepas log masuk

Untuk contoh, jika anda mempunyai dua rentetan dalam MySQL:

SET @a = "Welcome to Stack Overflow";
SET @b = "Hello to stack overflow";
Salin selepas log masuk

Menggunakan fungsi levenshtein_ratio:

SELECT LEVENSHTEIN_RATIO(@a, @b);
Salin selepas log masuk

Akan mengembalikan nilai yang mewakili peratusan persamaan antara dua rentetan, mis. 60 untuk contoh yang disediakan.

Atas ialah kandungan terperinci Bagaimana untuk Mengira Peratusan Kesamaan Rentetan dengan Cekap dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Kurangkan penggunaan memori MySQL di Docker Kurangkan penggunaan memori MySQL di Docker Mar 04, 2025 pm 03:52 PM

Kurangkan penggunaan memori MySQL di Docker

Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table? Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table? Mar 19, 2025 pm 03:51 PM

Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table?

Cara menyelesaikan masalah MySQL tidak dapat membuka perpustakaan bersama Cara menyelesaikan masalah MySQL tidak dapat membuka perpustakaan bersama Mar 04, 2025 pm 04:01 PM

Cara menyelesaikan masalah MySQL tidak dapat membuka perpustakaan bersama

Apa itu SQLite? Gambaran Keseluruhan Komprehensif Apa itu SQLite? Gambaran Keseluruhan Komprehensif Mar 04, 2025 pm 03:55 PM

Apa itu SQLite? Gambaran Keseluruhan Komprehensif

Jalankan MySQL di Linux (dengan/tanpa bekas podman dengan phpmyadmin) Jalankan MySQL di Linux (dengan/tanpa bekas podman dengan phpmyadmin) Mar 04, 2025 pm 03:54 PM

Jalankan MySQL di Linux (dengan/tanpa bekas podman dengan phpmyadmin)

Menjalankan Pelbagai Versi MySQL di MacOS: Panduan Langkah demi Langkah Menjalankan Pelbagai Versi MySQL di MacOS: Panduan Langkah demi Langkah Mar 04, 2025 pm 03:49 PM

Menjalankan Pelbagai Versi MySQL di MacOS: Panduan Langkah demi Langkah

Bagaimanakah saya menjamin MySQL terhadap kelemahan biasa (suntikan SQL, serangan kekerasan)? Bagaimanakah saya menjamin MySQL terhadap kelemahan biasa (suntikan SQL, serangan kekerasan)? Mar 18, 2025 pm 12:00 PM

Bagaimanakah saya menjamin MySQL terhadap kelemahan biasa (suntikan SQL, serangan kekerasan)?

Bagaimana saya mengkonfigurasi penyulitan SSL/TLS untuk sambungan MySQL? Bagaimana saya mengkonfigurasi penyulitan SSL/TLS untuk sambungan MySQL? Mar 18, 2025 pm 12:01 PM

Bagaimana saya mengkonfigurasi penyulitan SSL/TLS untuk sambungan MySQL?

See all articles