1

データベースでチェックする必要がある要件がありpipe |ます。見つかった場合は、別の方法で遊ぶ必要があります。

ここに私のdbテーブルがどのように見えるか //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

データを修正する必要があると思います。すべてのデータが修正されるまで、次の 2 つのステートメントを続けて実行できます。

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

実際、最善の解決策は、データ構造を変更することです。この現在の構造は推奨されません。各「セル」には値が 1 つだけ含まれている必要があります。特定の ID に対して複数のファイルを保存する必要がある場合は、

id    fruit

11    Apple
11    Mango

これにはコード/テーブルの調整が必要になる場合がありますが、将来のハッキングの必要性を防ぐことができます。

于 2013-01-10T05:28:30.453 に答える