2017-09-26 11 views
0

mysqlでストアドプロシージャを作成するのは初めてです。それは100-200エントリBUT 500+(時には25K)まで大きくなったレコードのに正常に動作しているエラーコード:1172。結果は複数の行で構成されています[MySQL]

first- get count of all records 

second- loop through that table 1 by 1 

third- compare each entry if it is a duplicate 

fourth- insert duplicate in a temporary table 

last- display duplicates 

ことがあるん何

は、それがメッセージに

エラーがスローされますコード:1172.結果は複数の行で構成されています

私はこの問題をGoogleで検索しましたが、私の問題を解決する。

私のスクリプト

BEGIN 

DECLARE n INT DEFAULT 0; 
DECLARE i INT DEFAULT 0; 

DECLARE i_sku VARCHAR(255); 
DECLARE i_concatenated_attributes MEDIUMTEXT; 

DECLARE f_sku VARCHAR(255); 
DECLARE f_offer_type VARCHAR(255); 
DECLARE f_name VARCHAR(255); 
DECLARE f_product_owner VARCHAR(255); 
DECLARE f_listing_city VARCHAR(255); 
DECLARE f_listing_area VARCHAR(255); 
DECLARE f_price DOUBLE; 
DECLARE f_bedrooms INT; 
DECLARE f_building_size INT; 
DECLARE f_land_size INT; 
DECLARE f_concatenated_attributes MEDIUMTEXT; 
DECLARE f_duplicate_percentage INT; 

SELECT COUNT(*) FROM unit_temp_listing INTO n; 
CREATE TEMPORARY TABLE IF NOT EXISTS temp_temp (dup_sku VARCHAR(255), dup_percentage INT, attribs MEDIUMTEXT); 
SET i=0; 
WHILE i<n DO 
    -- Get all unit listings (one by one) 
    SELECT 
    sku, concat_ws(',',offer_type,name,product_owner,listing_city,listing_area,price,ifnull(bedrooms,0),ifnull(building_size,0),ifnull(land_size,0)) as concatenated_attributes 
INTO i_sku, i_concatenated_attributes 
FROM unit_temp_listing 
limit 1 offset i; 
-- Compare one by one (sadla) 
SELECT 
    f.sku, f.offer_type, f.name, f.product_owner, f.listing_city, f.listing_area, f.price, f.bedrooms, f.building_size, f.land_size, 
    levenshtein_ratio(concat_ws(',',f.offer_type,f.name,f.product_owner,f.listing_city,f.listing_area,f.price,ifnull(f.bedrooms,0),ifnull(f.building_size,0),ifnull(f.land_size,0)),i_concatenated_attributes) as f_duplicate_percentage, 
    concat_ws(',',f.offer_type,f.name,f.product_owner,f.listing_city,f.listing_area,f.price,ifnull(f.bedrooms,0),ifnull(f.building_size,0),ifnull(f.land_size,0)) as fconcatenated_attributes 
INTO f_sku, f_offer_type, f_name, f_product_owner, f_listing_city, f_listing_area, f_price, f_bedrooms, f_building_size, f_land_size, f_duplicate_percentage, f_concatenated_attributes 
FROM unit_temp_listing f 
WHERE substring(soundex(concat_ws(',',offer_type,name,product_owner,listing_city,listing_area,price,ifnull(bedrooms,0),ifnull(building_size,0),ifnull(land_size,0))),1,10) = substring(soundex(i_concatenated_attributes),1,10) 
    AND levenshtein_ratio(concat_ws(',',offer_type,name,product_owner,listing_city,listing_area,price,ifnull(bedrooms,0),ifnull(building_size,0),ifnull(land_size,0)),i_concatenated_attributes) > 90 
    AND f.sku != i_sku; 
-- INSERT duplicates 
IF(f_sku IS NOT NULL) THEN 
    INSERT INTO temp_temp (dup_sku, dup_percentage, attribs) VALUES (f_sku, f_duplicate_percentage, f_concatenated_attributes); 
    SET f_sku = null; 
    SET f_duplicate_percentage = null; 
    SET f_concatenated_attributes = null; 
END IF; 
SET i = i + 1; 
END WHILE; 
SELECT * FROM temp_temp; 
DROP TABLE temp_temp; 
End 

問題は何であるのを見てください?

答えて

0

私の仲間のデベロッパーの皆さん、こんにちは私は既に私の問題を解決しました。私はここでそれを共有したいと思います。

問題は、私の SECOND SELECTステートメント内のループは、複数の行を返していました。 CURSORを使ってみましたが、まだエラーメッセージが表示されています。だから私はこの

INSERT INTO table_name (columns, ...) SELECT_STATEMENT 

ようINSERT文の中の鉱山の二SELECT文を入れてみました、その後、問題が解決されました!しかし、ここに誰かが私のクエリを最適化するアイデアを持っている場合は、私を助けてください。私は20k +のレコードを処理しなければならないが、実行時間が長すぎるため、私は15-20分だけ500を解決する。

ありがとうございます(執筆時の)18回の閲覧

ハッピーコーディング!

関連する問題