1

我有一个需要pipe |在数据库中检查 a 的要求。如果发现我需要以不同的方式玩耍。

这是我的数据库表的样子 //Please check the | character in row 11

在此处输入图像描述

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

在此处输入图像描述

哪个是对的。

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

在此处输入图像描述

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

任何片段都会有所帮助。

4

4 回答 4

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 />"; 
}
于 2013-01-10T05:52:15.560 回答
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);

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

于 2013-01-10T05:17:59.983 回答
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 语句将更加复杂

于 2013-01-10T05:23:01.267 回答
0

实际上最好的解决方案是改变你的数据结构。不推荐这种当前结构。每个“单元格”必须只包含一个值。如果您需要为特定 ID 存储多个 fuirt,请使用

id    fruit

11    Apple
11    Mango

这可能需要对您的代码/表格进行一些调整,但这将防止未来需要更多的黑客攻击。

于 2013-01-10T05:28:30.453 回答