1

我面临着一个独特的挑战。

我有一张包含 100 个号码的表格,名为 HUNDREDNUMBERS。我想选择最好的季度(75 到 100 个数字),并将它们放入另一个名为 BESTQUARTER 的表中。

我还想选择最差的季度(1 到 25 个数字),我想将它们放入另一个名为 WORSTQUARTER 的表中。

到目前为止,这是我的 Mysql 代码,

$Extract_Data = "
CREATE  TABLE $BESTQUARTER  
SELECT 
HUNDREDNUMBERS.number
FROM 
HUNDREDNUMBERS order by 
HUNDREDNUMBERS.number desc LIMIT 25 ";
$QuerySuccess =  mysql_query($Extract_Data, $connection);

对于另一张桌子....

 $Extract_Data = "
 CREATE  TABLE $WORSTQUARTER  
 SELECT 
 HUNDREDNUMBERS.number
 FROM 
 HUNDREDNUMBERS order by 
 HUNDREDNUMBERS.number asc LIMIT 25 ";
 $QuerySuccess =  mysql_query($Extract_Data, $connection);

问题是这个脚本每次都不是 100% 正确的。注意两个查询中的 ASC 和 DESC。这是一种尝试对数字进行排序的巧妙方法。

顺便说一句,HUNDREDNUMBERS 表中的一些数字有小数点。我需要两个新表 BESTQUARTER 和 WORSTQUARTER 中的数据进行进一步处理。

任何帮助是极大的赞赏

4

4 回答 4

2

您正在进行字符串比较,并且这些比较遵循与数字数据类型不同的规则;我建议更改您的排序表达式:

ORDER BY CAST(HUNDREDNUMBERS.number AS UNSIGNED) DESC|ASC

如果您需要分别支持负数或浮点数,UNSIGNED您也可以使用SIGNEDor代替。DECIMAL(M, N)

或者(并且最好),您可以将number列更改为自行正确排序的类型;VARCHAR应该主要用于文本。

于 2013-04-08T13:02:10.617 回答
1

您应该检查数据类型。确保数字至少存储为小数。其他数据类型可能会导致排序关闭(这是一个很常见的错误)。看起来很简单,但是从我对问题的理解来看,您的代码实际上看起来是正确的。

于 2013-04-08T13:03:52.577 回答
0

如果您只有 100 个数字,我建议您创建一个带有排名的视图,并将其用于后续处理。使用中间表似乎有点矫枉过正:

select hn.*,
       (select count(*) from hundrednumbers hn2 where hn2.number <= hn.number
       ) as rank
from HundredNumbers hn

使用索引hundrednumbers(number),这甚至会有不错的表现。

您遇到的问题可能是原始数据中的重复项。如果是这样,查看排名可以帮助您弄清楚在这种情况下该怎么做。

于 2013-04-08T12:55:14.217 回答
0

经过长时间的思考和测试,我相信我终于破解了它。

1)我将字段名“数字”更改为 DOUBLE UNSIGNED。(最初我使用的是 VARCHAR(50) )

2) 每当您使用两个或多个具有相同字段名的表时,请在每个字段名前加上其表名。我这样做了,它奏效了,正如您将在下面的完整查询中看到的那样。

3) 原始数据多次出现相同的数字,即有多个值为100 的行实例。MySQL 仅将一个值为100 的行传输到表BESTQUARTER 中。(我不知道为什么)。

uniqueid    | id    | numbers   
1   200 100
2   6   100
3   76  100
4   64  99.009987655
5   10  95.98765432
6   11  11.98765432
7   12  25.12
8   13  53.173543
9   153 72.87676
10  32  99

所以我添加了“GROUP By”并使用了 ID 字段。(注:“uniqueid”列为主键,“id”为唯一键,唯一标识每个数字)

这是新代码

create table BESTQUATER  
select 
HUNDREDNUMBERS.uniqueid , 
HUNDREDNUMBERS.id, 
HUNDREDNUMBERS.numbers
FROM 
HUNDREDNUMBERS
group by HUNDREDNUMBERS.id
ORDER BY HUNDREDNUMBERS.numbers  DESC  LIMIT 25
于 2013-04-10T14:33:33.930 回答