0

1 つのテーブルといくつかのフィールドを持つ単純なデータベースがあります。そのうちの 1 つは、常に同じアルファ プレフィックスの後に 3 文字のプレイヤー名と 1 から 100 の範囲の番号が続くテキスト フィールドです。

テキスト レコードは次のようになります。これは、サード パーティ アプリケーションで生成された .txt ファイルから LOAD LOCAL INFILE コマンドを実行した結果です。

グランドチャンピオン MAC 1,180,611,620

トップアングラー 1) MAC 963,956,660 2) MAC 777,545,450 3) MAC 774,563,200 4) MAC 659,721,170

最大の嘘つき DVA 6 フィッシュ 4 テイルズ

トップ ボート ロッカー MAC 24 ロック ボート

PHP を使用して、DVA に続く数値を整数に変換し、最大から最小に並べ替えようとしています。BIGGEST LIAR から 4 tales までのブロックのみを表示する私の PHP コードは次のとおりです。

$data = mysql_query("SELECT * FROM stats WHERE tablestats LIKE '%biggest liar%' ORDER BY CONVERT(SUBSTRING(tablestats, LOCATE('LIAR', tablestats) +5), SIGNED INTEGER),tablestats DESC LIMIT 5;")

or die(mysql_error()); 
while($info = mysql_fetch_array( $data )) 
{ 
echo substr($info['tablestats'],151,40);
Print "<br>";
} 
?>

これにより、探しているテキストを含むページが生成され、最終的に次のようにレンダリングされます

最大の嘘つき DVA 6 フィッシュ 4 テイルズ

ただし、3 文字のユーザー名に続く変数が変更される複数のレコードでは、DESC による順序付けが正しく機能しないようです。数字が単数 (1 から 9) の場合は問題ないように見えますが、値が 10 を超える場合、1 つのレコードが 6 でもう 1 つのレコードが 10 の場合、10 より前に 6 がリストされることに気付きました。

私がここでやろうとしているのは、3 文字のユーザー名の後に 1 つのスペースに続いて数値を指定することです。これは、ここでの数値が 1 から 100 になる可能性があることを考慮して、それを整数と順序に変換することです。

どんな助けでも大歓迎です、

トニー。

4

1 に答える 1

0

私はあなたがこのようなものを使うことを検討しているかもしれないと思います:

SELECT *, 
  CONVERT(
     SUBSTRING(tablestats, 
               LOCATE('LIAR ', tablestats) + LENGTH('LIAR ') + 4), 
     SIGNED INTEGER)
FROM stats 
WHERE tablestats LIKE '%biggest liar%' 
ORDER BY 2 DESC

SQLフィドルデモ

検索文字列(この場合はLIAR)を使用し、ステートメントごとに4文字を追加します。文字名は常に3文字です。これが当てはまらない場合は、LOCATEを再度使用して次のスペースを見つけることができます。

ところで、このようなCONVERTメソッドの使用は、他のRDBMSでは機能しません。MySQLは、最初の非数値までの数値を変換します。したがって、変換する前に文字列の残りの部分を削除する必要がない理由。

于 2013-03-06T03:11:01.053 に答える