我有一个简单的数据库,包含1个表和多个字段,其中一个是一个文本字段,它始终具有相同的字母前缀,后跟一个3字符的播放器名称,然后是1到100之间的数字。
文本记录看起来像这样,是LOAD LOCAL INFILE命令的结果,形成第三方应用程序生成的.txt文件。
GRAND CHAMPION MAC 1,180,611,620
TOP ANGLERS 1)MAC 963,956,660 2)MAC 777,545,450 3)MAC 774,563,200 4)MAC 659,721,170
最大的骗局 DVA 6 FISH 4 TALES
TOP BOAT ROCKER 苹果电脑 24摇滚船
使用PHP我试图将DVA之后的数值转换为整数,并从最大到最小排序。我的PHP代码只显示从BIGGEST LIAR到4个故事的块如下。
$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>";
}
?>
这将生成一个页面,其中包含我正在寻找的文本,最终呈现为
BIGGEST LIAR DVA 6 FISH 4 TALES
但是,如果有多个记录,其中3个字符用户名后面的变量发生了变化,那么使用DESC进行排序似乎无法正常工作。我注意到当数字是单数(1到9)时似乎没问题但是如果值超过10则是一个记录为6而另一个为10的实例导致在10之前列出6个。
我在这里要做的是在3个字符的用户名之后指定一个空格后面的数值,考虑到这里的数字可能是1到100,然后将其转换为整数和顺序。
非常感谢任何帮助,
贝。
答案 0 :(得分:0)
我认为你可能会考虑使用这样的东西:
SELECT *,
CONVERT(
SUBSTRING(tablestats,
LOCATE('LIAR ', tablestats) + LENGTH('LIAR ') + 4),
SIGNED INTEGER)
FROM stats
WHERE tablestats LIKE '%biggest liar%'
ORDER BY 2 DESC
在这种情况下使用您的搜索字符串LIAR,并为您的语句添加4个字符 - 字符名称始终为3个字符。如果不是这样,您可以再次使用LOCATE来查找下一个空格。
BTW - 使用像这样的CONVERT方法在其他RDBMS中不起作用。 MySQL将它找到的数值转换为第一个非数字值。因此,您无需在转换之前删除其余字符串。