내가 함께 테이블 형식적인 정의를 넣어 시작합니다
: 여기
warehouse:
warehouse_id,
warehouse_product_id,
product_brand,
product_name,
local_id
나는 당신의 '모델'테이블에 외래 키로 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입니다. 거기에 채워진 될 필요가 창고 테이블에서 행 집합을 감안할 때
mysql implementation here
: (이전 쿼리에서 값을 사용으로 최적의 일치를 확인
SELECT w.*
FROM warehouse w
WHERE w.local_id IS NULL;
를 ... 각 행에 대해 w로 . *) ....
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 문으로 구현 될 수있다 :
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