我需要检查数据库中的pipe |
。如果发现我需要以不同的方式玩游戏。
这里我的db表如何看起来像//Please check the | character in row 11
如果我通过sql命令运行一个组myresult将是
哪个是对的。
但我的要求是打破任何单元格中的|
并相应地计算。预期结果为
这可以单独使用MySQL命令完成,还是需要使用一些PHP脚本?
任何代码段都会有所帮助。
答案 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
这可能需要对您的代码/表进行一些调整,但这样可以避免需要更多未来的黑客攻击。