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

Bagaimana Saya Bisa MEMILIH Baris Serupa di Dua Tabel Berbeda di MySQL (Apakah Mungkin?)

Untuk implementasi UDF dari Jarak Levenshtein algoritme Anda mungkin ingin memeriksa "codejanitor.com:Jarak Levenshtein sebagai Fungsi Tersimpan MySQL ":

CREATE FUNCTION LEVENSHTEIN (s1 VARCHAR(255), s2 VARCHAR(255))
RETURNS INT
DETERMINISTIC
BEGIN
  DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
  DECLARE s1_char CHAR;
  DECLARE cv0, cv1 VARBINARY(256);
  SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0;
  IF s1 = s2 THEN
    RETURN 0;
  ELSEIF s1_len = 0 THEN
    RETURN s2_len;
  ELSEIF s2_len = 0 THEN
    RETURN s1_len;
  ELSE
    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;
      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 c;
END

Sekarang mari kita buat kasus uji, menggunakan data yang Anda berikan dalam pertanyaan Anda:

CREATE TABLE table_a (name varchar(20));
CREATE TABLE table_b (name varchar(20));

INSERT INTO table_a VALUES('Olde School');      
INSERT INTO table_a VALUES('New School');
INSERT INTO table_a VALUES('Other, C.S. School');
INSERT INTO table_a VALUES('Main School');
INSERT INTO table_a VALUES('Too Cool for School');

INSERT INTO table_b VALUES('Old School');
INSERT INTO table_b VALUES('New ES');
INSERT INTO table_b VALUES('Other School');
INSERT INTO table_b VALUES('Main School');
INSERT INTO table_b VALUES('Hardknocks School');

Kemudian:

SELECT     *
FROM       table_a a
LEFT JOIN  table_b b ON (a.name = b.name);

Jelas mengembalikan kecocokan di mana nama sekolah sama persis:

+---------------------+-------------+
| name                | name        |
+---------------------+-------------+
| Olde School         | NULL        |
| New School          | NULL        |
| Other, C.S. School  | NULL        |
| Main School         | Main School |
| Too Cool for School | NULL        |
+---------------------+-------------+
5 rows in set (0.00 sec)

Sekarang kita dapat mencoba menggunakan LEVENSHTEIN berfungsi untuk mengembalikan nama sekolah yang memiliki edit jarak dari 2 karakter atau kurang:

SELECT     *
FROM       table_a a
LEFT JOIN  table_b b ON (LEVENSHTEIN(a.name, b.name) <= 2);

+---------------------+-------------+
| name                | name        |
+---------------------+-------------+
| Olde School         | Old School  |
| New School          | NULL        |
| Other, C.S. School  | NULL        |
| Main School         | Main School |
| Too Cool for School | NULL        |
+---------------------+-------------+
5 rows in set (0.08 sec)

Sekarang menggunakan <= 3 sebagai ambang batas jarak edit:

SELECT     *
FROM       table_a a
LEFT JOIN  table_b b ON (LEVENSHTEIN(a.name, b.name) <= 3);

Kami mendapatkan hasil berikut:

+---------------------+--------------+
| name                | name         |
+---------------------+--------------+
| Olde School         | Old School   |
| Olde School         | Other School |
| New School          | Old School   |
| Other, C.S. School  | NULL         |
| Main School         | Main School  |
| Too Cool for School | NULL         |
+---------------------+--------------+
6 rows in set (0.06 sec)

Perhatikan bagaimana kali ini Olde School juga cocok dengan Other School , dan New School cocok dengan Old School demikian juga. Ini mungkin positif palsu, dan menunjukkan bahwa menentukan ambang sangat penting untuk menghindari kecocokan yang salah.

Salah satu teknik umum untuk mengatasi masalah ini adalah dengan mempertimbangkan panjang string saat menerapkan ambang batas. Faktanya, situs yang Saya mengutip untuk implementasi ini juga menyediakan LEVENSHTEIN_RATIO fungsi yang mengembalikan rasio (sebagai persentase) dari perbedaan edit berdasarkan panjang string.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Aktifkan akses jarak jauh ke database MySQL

  2. Menambahkan bidang alias MySQL bersama-sama

  3. pilih nilai acak berdasarkan peluang probabilitas

  4. apakah mungkin untuk akses jarak jauh ke database mysql di shared hosting?

  5. mysql pilih int sebagai mata uang atau konversi int ke format mata uang?