0

我有一张桌子:

left  | right
--------------
123   | test
12345 | test2
1234  | test3

需要在左列中找到最匹配的条目并从右列输出条目。

示例:我想为 12345678 找到最匹配的条目(它是 12345 | test2)并在输出中获取 test2。我试过定位,但不知道如何输出右列。

4

4 回答 4

2

'Mosty Mostacho' 给出的答案很好,它提到你需要找到 Levenshtein 距离。这是另一种方法,只需获取输入字符串等所有术语,然后按LEFT列按降序排列结果

SELECT 
  `right` 
FROM 
  mytable 
WHERE 
  '12345678' LIKE CONCAT(`left`,'%') 
ORDER BY 
  `left` DESC 
LIMIT 
  1

SQLFIDDLE

于 2013-08-15T07:19:55.480 回答
0

你必须澄清什么most matching entry意思。我了解您的意思是计算所有元素的Levenshtein 距离并获得其中最少的元素。

因此,首先您必须创建一个用户定义函数来计算距离。检查此链接

一旦你设置了 UDF,你应该运行的查询是:

select `right` from t
order by levenshtein('your_word', `left1`)
limit 1
于 2013-08-15T07:05:28.103 回答
0

Try something like this:-

SELECT Coulmn2
FROM Table
WHERE  MATCH ( Coumn1)
AGAINST (  '%$keywords%' )
于 2013-08-15T06:30:33.210 回答
0
DELIMITER $$  
    CREATE PROCEDURE FIND(IN @yourtext varchar(100))

       BEGIN
          DECLARE a INT Default 0 ;
          myloop: LOOP

             IF EXISTS (SELECT * FROM your_table 
             WHERE LeftColumn LIKE '%'+substr(@yourtext,0,length(LeftColumn)-a)+'%')
             SELECT RightColumn FROM your_table 
             WHERE LeftColumn LIKE '%'+substr(@yourtext,0,length(LeftColumn)-a)+'%'
             LEAVE myloop;
             END IF

             SET a=a-1;
             select a;
             IF a=0 THEN
                LEAVE myloop;
             END IF;
       END LOOP myloop;
    END $$
于 2013-08-15T06:43:48.067 回答