0

我有一个简单的数据库,其中包含 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 故事

TOP BOAT ROCKER MAC 24 岩石船

使用 PHP 我试图将 DVA 之后的数值转换为整数,并将其从最大到最小排序。我的 PHP 代码仅显示从 BIGGEST LIAR 到 4 tales 的块如下。

$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,那么一个记录为 6,另一个记录为 10 的实例会导致 6 在 10 之前列出。

我在这里要做的是在 3 个字符的用户名后面指定一个空格后的数值,考虑到这里的数字可能是 1 到 100,然后将其转换为整数和顺序。

任何帮助将非常感激,

托尼。

4

1 回答 1

0

I think you might be looking into using something like this:

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

SQL Fiddle Demo

Uses your search string, LIAR in this case, and adds 4 characters per your statement -- character name is always 3 characters. If this is not true, you can use LOCATE again to find the next space.

BTW -- using the CONVERT method like this doesn't work in other RDBMS. MySQL converts the numeric values it finds up until the first non-numeric value. Hence the reason you don't have to remove the rest of the string before converting.

于 2013-03-06T03:11:01.053 回答