Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengira Peratusan Kesamaan Rentetan dengan Cekap 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.
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
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
Untuk contoh, jika anda mempunyai dua rentetan dalam MySQL:
SET @a = "Welcome to Stack Overflow"; SET @b = "Hello to stack overflow";
Menggunakan fungsi levenshtein_ratio:
SELECT LEVENSHTEIN_RATIO(@a, @b);
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!