簡體   English   中英

在MySQL中打破特殊字符

[英]Break a special character in MySQL

我有一個需要檢查pipe | 在數據庫中。 如果發現,我需要以不同的方式玩耍。

這是我的數據庫表的外觀//Please check the | character in row 11 //Please check the | character in row 11

在此處輸入圖片說明

如果我通過sql命令運行組,則myresult將是

在此處輸入圖片說明

哪個是對的。

但是我的要求是打破| 在任何單元格中並相應地計數。 預期結果為

在此處輸入圖片說明

可以單獨使用MySQL命令完成此操作,還是需要使用一些php腳本?

任何摘要都將有所幫助。

希望這個腳本可以幫助你

$frt =array();
$stmt = $mysqli->prepare("select `fruits` from `meva`") or $mysqli->error ;
$stmt->execute();
$stmt->bind_result($fruits);
 while ($stmt->fetch()) {
    $frt[]=$fruits;
  }

// var_dump($frt); //check all the fruits is in array  
 $res = array();
 $tot = count($frt);
 for($i=0;$i<=$tot;$i++)
  {

    if(preg_match("/\|/", $frt[$i]))
        {
    $res[] =explode( '|', $frt[$i]);
        }else
        {
    $res[] = $frt[$i];
        }
  }

 // var_dump($res);

$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($res));
foreach($it as $v) {
  $ary[]=$v;
 }

    $all_fruits = array();
    $tot_ary = count($ary);
  for($io=0;$io<=$tot_ary;$io++)
    {
      if(isset($ary[$io])!='')
    {
     $all_fruits[] = trim($ary[$io]);
    }else
    {
      continue;
    }
    }
 // var_dump($all_fruits);

$newArray = array_count_values($all_fruits);

foreach ($newArray as $key => $value) {
        echo "$key - <strong>$value</strong> <br />"; 
}

您可以使用php並按以下方式進行操作

$query = mysql_query("SELECT fruit FROM meva");

$cnt_array   = array();

while($row   = mysql_fetch_assoc($query)){
     $fruits = $row["fruit"];
     $fruit  = explode("|", $fruits);
     foreach($fruit as $fru){

         if(array_key_exists($fru,$cnt_array)){
            $cnt_array[$fru]   = $cnt_array[$fru]+1;
         }
          else{
            $cnt_array[$fru]   = 1;
          }
     }  
    }

print_r($cnt_array);

注意:此代碼未經測試,請嘗試並進行相應的編輯

我認為您應該修復數據。 您可以連續運行以下兩個語句,直到修復所有數據:

INSERT INTO meva (fruits)
SELECT SUBSTR(fruits, LOCATE('|', fruits) - 1)  FROM meva
WHERE LOCATE('|', fruits) > 0;

UPDATE meva
SET fruits = SUBSTR(fruits, LOCATE('|', fruits) + 1)
WHERE LOCATE('|', fruits) > 0;

這將修復表格。

但是,如果僅是按原樣從表中進行計數是您的面試問題(或學校作業),那么只有在知道給定行中最大管道數量的情況下,您才能這樣做。

因此,如果一行中的最大管道數為1,則您的select語句將為:

SELECT count(*),
CASE WHEN LOCATE('|', fruits) > 0 THEN SUBSTR(fruits, LOCATE('|', fruits) - 1) ELSE fruits END
FROM meva
GROUP BY CASE WHEN LOCATE('|', fruits) > 0 THEN SUBSTR(fruits, LOCATE('|', fruits) - 1) ELSE fruits END

如果您可以連續擁有多個管道,那么您的CASE語句將更加復雜

實際上,最好的解決方案是更改數據結構。 不建議使用此當前結構。 每個“單元格”只能包含一個值。 如果您需要為一個特定的ID存儲多個文件,請使用

id    fruit

11    Apple
11    Mango

這可能需要對您的代碼/表進行一些調整,但是它將防止將來需要更多的黑客。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM