2011-11-30 9 views
11

Obecnie ręcznie kreślę ciąg, w którym łączę wszystkie wartości w każdym wierszu w mojej tabeli. Jestem hashing ten ciąg dla każdego wiersza, aby uzyskać wartość mieszania dla bieżących wartości (/ status) wiersza, które później używam do określenia, czy wiersz został zmieniony.mySQL: uzyskać wartość mieszania dla każdego wiersza?

Zamiast robić to ręcznie, czy istnieje wbudowany sposób i mySQL, aby uzyskać unikalną wartość mieszania dla każdego wiersza?

Odpowiedz

17

mógłby zrobić coś podobnego

SELECT MD5(concat(field1, field2, field3, ...)) AS rowhash 

ale nie można uciec od notowań, które pola chcesz, jak concat(*) nie jest rozwiązaniem (błąd składni).

1

Lepiej używać funkcji concat_ws(). na przykład dwie sąsiednie kolumny: 12,3 => 1,23.

Niestety, nadal ma to pewne problemy. Pomyśl o wartości pustej, pustym łańcuchu, łańcuchu może zawierać ',', itd ...

Program jest wymagany do wygenerowania instrukcji mieszania, która powinna zastąpić wartość null do określonej wartości (dla kolumn o wartości null), oraz również używaj rzadko używanego char/byte jako separatora.

2

Cóż, zrobiłem mały skrypt, który mógłby zrobić dokładnie to, co chcesz, i może to, czego inni chcą ... więc tutaj jest ... dla PHP, który jest ... najpierw musisz zrobić listę kolumn tabeli, następnie tworzysz instrukcję "case when" dla każdej kolumny w oparciu o ich typ i wstaw ją do instrukcji concat_ws, a następnie mieszaj ją z sha1 ... użyłem tej metody na bardzo dużych tabelach (600000+ rekordy), a prędkość jest całkiem dobra po wybraniu wszystkich rekordów. Myślę też, że szybciej jest połączyć wymagane dane w concat_ws i eksplodować w php lub cokolwiek innego, ale to tylko przeczucie ...

<? 
$query= mysql_query("SHOW COLUMNS FROM $table", $linklive); 
     while ($col = mysql_fetch_assoc($query)) { 
      $columns[] = mysql_real_escape_string($col['Field']); 
      if ($col['Key'] == 'PRI') { 
       $key = mysql_real_escape_string($col['Field']); 
      } 
      $columnsinfo[$col['Field']] = $col; 
     } 
     $dates = array("date","datetime","time"); 
        $int = array("int","decimal"); 
        $implcols = array(); 
        foreach($columns as $col){ 
         if(in_array($columnsinfo[$col]['Type'], $dates)){ 
          $implcols[] = "(CASE WHEN (UNIX_TIMESTAMP(`$col`)=0 || `$col` IS NULL) THEN '[$col EMPTY]' ELSE `$col` END)"; 
         }else{ 
          list($type, $rest) = explode("(",$columnsinfo[$col]['Type']); 
          if(in_array($columnsinfo[$col]['Type'], $dates)){ 
           $implcols[] = "(CASE WHEN (`$col`=0 || `$col` IS NULL) THEN '[$col EMPTY]' ELSE `$col` END)"; 
          }else{ 
           $implcols[] = "(CASE WHEN (`$col`='' || `$col` IS NULL) THEN '[$col EMPTY]' ELSE `$col` END)"; 
          } 
         } 
        } 
        $keyslive = array(); 
        //echo "SELECT $key SHA1(CONCAT_WS('',".implode(",", $columns).")) as compare FROM $table"; exit; 
        $q = "SELECT $key as `key`, SHA1(CONCAT_WS('',".implode(", ",$implcols).")) as compare FROM $table"; 
    ?> 
+8

To wygląda na szalonego –

Powiązane problemy