mysql - 如何在同一张表中找到相似的记录?

标签 mysql

我有一个日程安排数据库,我想找到一种方法来选择所有类似的 future 约会,因为我们有很多客户自己重复预订。我一直在寻找,但找不到一种方法来做我想做的事。

例如,如果我有以下行,我希望能够选择具有相同语言、时间间隔在 15 分钟以内并且名称共享 > 70% 相同字符的行。

   |Rec_id|Date_time       |Language|App_name |
   |1     |2014-03-15 12:40|Spanish |Ricardo  |
   |2     |2014-03-15 12:45|Spanish |Ricerdu  |
   |3     |2014-03-16 12:45|Tongan  |Tuaffu   |
   |4     |2014-03-17 12:45|Korean  |Kim      |
   |5     |2014-03-18 12:45|German  |Biternof |
   |6     |2014-03-18 12:32|German  |Biterknof|

根据以上数据,我需要的记录是 1、2、5 和 6。

最佳答案

我首先想到的是 Levenshtein,但由于 MySQL 本身不支持它 - 事情变得有点复杂。

此解决方案未优化或根本不是最佳解决方案,但我应该完成这项工作。

  • 我会创建一个新列,我们称它为“Duplicate_for”,DEFAULT NULL。
  • 我会为这个表创建一个触发器:TRIGGER BEFORE INSERT。
  • 我会创建一个函数来计算两个字符串的 Levenshtein 距离。
  • 我会将 TRIGGER 和 Levenshtein 与以下查询结合使用。

触发器+查询本身:

DELIMITER //
CREATE TRIGGER `booking_before_insert` BEFORE INSERT ON `booking` FOR EACH ROW BEGIN
    DECLARE existingId INT(10) DEFAULT NULL;

    SELECT 
        MAX(id) 
    INTO 
        existingId
    FROM 
        booking 
    WHERE   
        booking.dirty_id IS NULL AND
        booking.lang = NEW.lang AND
        booking.created >= DATE_SUB(NOW(), INTERVAL 15 MINUTE) AND 
        (LEVENSHTEIN(booking.name, NEW.name) / LENGTH(booking.name)) < 0.3;

    SET NEW.dirty_id = existingId;
END//
DELIMITER ;

您可以从以下位置阅读有关 Levenshtein 的更多信息:

现在您可以使用 Duplicate_for 检测重复项。

关于mysql - 如何在同一张表中找到相似的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22025794/

相关文章:

mysql - 如何拥有一个包含两种变量列的表

mysql - Elasticsearch是否可以与MongoDB这样的文档数据库或MySQL这样的关系数据库更好地协作?

php - MySQL/PHP : nonrepeating random selection with unique ID selectors

mysql - Apache Spark : Is it good to use structured data

mysql - Slick 3.0 (scala) 查询在运行多次之前不会返回数据(我认为)

php - 在PHP中计算纬度/经度GPS点周围的半径

php - 输入注册时尚未创建的客户 ID

mysql - 您可以在主从 (MySQL) 上以不同方式索引表吗

php - Laravel 5.3 对 sortBy 集合的分页

Python 值错误 : 'dictionary update sequence element #0 has length 4; 2 is required'