我有一个需要pipe |
在数据库中检查 a 的要求。如果发现我需要以不同的方式玩耍。
这是我的数据库表的样子 //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 存储多个 fuirt,请使用
id fruit
11 Apple
11 Mango
这可能需要对您的代码/表格进行一些调整,但这将防止未来需要更多的黑客攻击。