在MySQL中打破一个特殊的角色

时间:2013-01-10 05:07:47

标签: php mysql pipe

我需要检查数据库中的pipe |。如果发现我需要以不同的方式玩游戏。

这里我的db表如何看起来像//Please check the | character in row 11

enter image description here

如果我通过sql命令运行一个组myresult将是

enter image description here

哪个是对的。

但我的要求是打破任何单元格中的|并相应地计算。预期结果为

enter image description here

这可以单独使用MySQL命令完成,还是需要使用一些PHP脚本?

任何代码段都会有所帮助。

4 个答案:

答案 0 :(得分:1)

希望这个脚本可以帮助你

$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 />"; 
}

答案 1 :(得分:0)

您可以使用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);

注意:此代码未经过测试,请尝试并相应地进行编辑

答案 2 :(得分:0)

我认为你应该修复你的数据。您可以连续运行这两个语句,直到修复所有数据:

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语句将更复杂

答案 3 :(得分:0)

实际上,最好的解决方案是更改数据结构。不建议使用此当前结构。每个'单元'必须只包含一个值。如果您需要为特定ID存储多个fuirt,请使用

id    fruit

11    Apple
11    Mango

这可能需要对您的代码/表进行一些调整,但这样可以避免需要更多未来的黑客攻击。