2012-08-06 56 views
0

我已經使用levenshtein距離和比率源代碼創建了mysql用戶函數。我正在比較2條記錄,並基於75%的匹配我想選擇記錄。使用levenshtein距離比來比較2條記錄

  1. 訂單進入表paypal_ipn_ordersITEM標題
  2. 查詢執行對錶itemkey找到一個創紀錄的75%的比賽稱爲ITEM以及
  3. ,如果75%的標題爲符合其分配一個八位數字從表itemkeypaypal_ipn_orders

下面是該查詢

 UPDATE paypal_ipn_orders 
     SET sort_num = (SELECT sort_id 
     FROM itemkey 
     WHERE levenshtein_ratio(itemkey.item, paypal_ipn_orders.item_name) > 75) 
     WHERE packing_slip_printed = 0 
     AND LOWER(payment_status) = 'completed' 
     AND address_name <> '' 
     AND shipping < 100 

我已經調整了幾次,但它在levenshtein_ratio部分的第4行和第5行之間失敗。如果它工作,它說,子查詢返回多行。我不知道如何解決它,使其返回正確的結果,我只是失去了如何使這項工作。

+0

您顯示的查詢代碼中有兩個「WHERE」項。第二個應該是「AND」嗎? – 2012-08-06 21:51:50

+1

這是一個子查詢,所以它不需要是AND – user1542036 2012-08-07 00:04:39

回答

2

SET上的子查詢應只返回一個值。如果itemkey有多個項目是item_name的75%,你想要做什麼?以下將使用其中一個最佳匹配:

UPDATE paypal_ipn_orders 
SET sort_num = (SELECT sort_id 
    FROM itemkey 
    WHERE levenshtein_ratio(itemkey.item, paypal_ipn_orders.item_name) > 75 
    ORDER BY levenshtein_ratio(itemkey.item, paypal_ipn_orders.item_name) DESC 
    LIMIT 1) 
WHERE packing_slip_printed = 0 
    AND LOWER(payment_status) = 'completed' 
    AND address_name <> '' 
    AND shipping < 100 
+0

ok有很大意義,我發現這樣的子查詢執行得非常慢,似乎是超時,有沒有辦法將結果限制爲第一個結果,而不通過訂單。 – user1542036 2012-08-07 00:19:08

+0

好吧,我想它可能會很慢,因爲它爲每個paypal_ipn_orders.item名稱做Levenshtein。這可能是很多工作,但你怎麼能找到最好的?如果你願意將結果限制在第一個或兩個字母的確切匹配位置,那可能會加快速度。 – Andrew 2012-08-07 01:02:09

+0

所以我想我可以先將我需要的值加載到一個臨時表中,然後執行levenshteins距離/比率,然後這不會超時,我的訂單表是蠻力的。但我認爲這會奏效。 – user1542036 2012-08-21 06:10:42