2012-12-12 14 views
7

Poniżej znajduje mój SQL skrzypce: http://sqlfiddle.com/#!2/f9bae/1Update nie aktualizuje cały ciąg

W którym staram się sprawdzić, czy cała nazwa jest weryfikowana przez tabeli przeglądowej, czy nie i czy jest jakiś błąd to powinno otrzymuje poprawną wartość, ale problem, z którym się spotykam, polega na tym, że jeśli jakaś nazwa zawiera więcej niż jedną błędną wartość, to zapytanie tylko aktualizuje jedną część tej nazwy i pozostawia resztę niezmienioną, uprzejmie daj mi znać, jak mogę zmodyfikować moje zapytanie o aktualizację więc zaktualizuje całą nazwę zgodnie z poprawnymi wartościami tabeli odnośników.

Dzięki,

Odpowiedz

2

Oto SQLFIddle demo

ta brzydka kwerenda działa dla maksymalnie 4 zamienników w ciąg. Jeśli potrzebujesz więcej zamienników, najlepszym sposobem jest utworzenie funkcji zdefiniowanej przez użytkownika, która zastąpi te słowa w jednym ciągu i użyje go do aktualizacji.

UPDATE table1 a 
    LEFT JOIN lookup b1 on a.username LIKE CONCAT('%', b1.`WRONG`, '%') 
    LEFT JOIN lookup b2 on a.username LIKE CONCAT('%', b2.`WRONG`, '%') 
      and (b2.Wrong not in (b1.Wrong)) 
    LEFT JOIN lookup b3 on a.username LIKE CONCAT('%', b3.`WRONG`, '%') 
      and (b3.Wrong not in (b1.Wrong,b2.Wrong)) 
    LEFT JOIN lookup b4 on a.username LIKE CONCAT('%', b4.`WRONG`, '%') 
      and (b4.Wrong not in (b1.Wrong,b2.Wrong,b3.Wrong)) 

SET a.username = 
REPLACE(
    REPLACE(
     REPLACE(
      REPLACE(a.username, IFNULL(b1.`WRONG`,''), IFNULL(b1.`RIGHT`,'')) 
     , IFNULL(b2.`WRONG`,''), IFNULL(b2.`RIGHT`,'')) 
    , IFNULL(b3.`WRONG`,''), IFNULL(b3.`RIGHT`,'')) 
    , IFNULL(b4.`WRONG`,''), IFNULL(b4.`RIGHT`,'')) 
+0

dziękuję bardzo za pomoc! :) –

0

z konfiguracją może łatwiej będzie po prostu uruchomić aktualizację zapisu do 3 razy, które będą obsługiwać powtórzenia. Na Chaudhary marginesie lub Choudhary jest chyba bardziej w prawo w porównaniu do chodry :)

http://sqlfiddle.com/#!2/2d4c6/1

EDIT: Ewentualnie można pozbyć tabeli przeglądowej, jeśli nie mają zbyt wiele wpisów tam tak: -

http://sqlfiddle.com/#!2/890ea/1

+0

Nie należy tego robić za pomocą jednego zapytania, ponieważ niektóre nazwy zawierają cztery kombinacje, a niektóre pięć. Więc jeśli pójdę po to najgorszy scenariusz ...: -] –

+0

Jeśli nie masz zbyt wielu poprawek, możesz spróbować umieścić je w jednym zamienniku. – Himanshu