私は一緒にテーブルのより正式な定義置くことから始めましょう:私はあなたの「モデル」テーブルへの外部キーとして使用してlocal_idのだ。ここ
warehouse:
warehouse_id,
warehouse_product_id,
product_brand,
product_name,
local_id
を - しかし、さらなる混乱を避けるために、
local:
id,
product_brand,
product_name
「製品」と表記している表は冗長であるようです。
明らかに、データが相互参照されるまで、local_idはnullになります。それが移入された後、しかし、それは変更する必要はありません、とWAREHOUSE_ID、バンドや製品を考えると、簡単にあなたのローカル記述を見つけることができます。
SELECT local.*
FROM local, warehouse
WHERE local.id=warehouse.local_id
AND warehouse.product_brand=local.product_brand
AND warehouse_id=_____
AND warehouse.product_brand=____
AND warehouse.product_name=____
だから、あなたがする必要があるすべてはリンクを移入です。 Soundexはかなり粗雑なツールです。これに対しては、より良い解決策はLevenstein distance algorithmです。各行は(Wとして以前のクエリからの値を用いるものとして最良一致を識別するための
SELECT w.*
FROM warehouse w
WHERE w.local_id IS NULL;
...:移入する必要が倉庫テーブルの行のセットを考えるmysql implementation here
があります。*)....
SELECT local.id
FROM local
WHERE local.product_brand=w.product_brand
ORDER BY levenstein(local.product_name, w.product_name) ASC
LIMIT 0,1
しかし、2つの文字列が完全に異なる場合でも、これは最もよく一致します。したがって、...
SELECT local.id
FROM local
WHERE local.product_brand=w.product_brand
AND levenstein(local.product_name, w.product_name)<
(IF LENGTH(local.product_name)<LENGTH(w.product_name),
LENGTH(local.product_name), LENGTH(w.product_name))/2
ORDER BY levenstein(local.product_name, w.product_name) ASC
LIMIT 0,1
...一致する文字列の半分以上が必要です。
は、これは、単一の更新ステートメントで実装できます。
UPDATE warehouse w
SET local_id=(
SELECT local.id
FROM local
WHERE local.product_brand=w.product_brand
AND levenstein(local.product_name, w.product_name)<
(IF LENGTH(local.product_name)<LENGTH(w.product_name),
LENGTH(local.product_name), LENGTH(w.product_name))/2
ORDER BY levenstein(local.product_name, w.product_name) ASC
LIMIT 0,1
)
WHERE local_id IS NULL;
は 'bmw' ... – ajreal