2013-04-08 122 views
1

我正面临一个独特的挑战。使用php和mysql高级排序和搜索mysql数据库

我得到了一个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中的数据作进一步处理。

任何帮助是极大的赞赏

+1

当它是不是100%正确,会发生什么? – 2013-04-08 12:51:21

+0

它返回错误的数字。例如BESTQUARTER表包含偶数小于25.因此WORSTQUARTERS包含的数字高于75 – lloyd 2013-04-08 12:54:31

+0

字段的类型是什么decimal or varchar? – 2013-04-08 12:54:57

回答

0

如果你只有100个号码,我会建议你创建一个级别的视图,并用它进行后续处理。采用中间表,似乎有点小题大做:

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

随着hundrednumbers(number)索引,这甚至将有不俗的表现。

您可能遇到的问题在原始数据中是重复的。如果是这样,查看队伍可以帮助你找出在这种情况下要做什么。

2

你正在做字符串比较,那些比数字数据类型遵循不同的规则;我建议改变你的排序表达式:

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

相反UNSIGNED,你也可以使用SIGNEDDECIMAL(M, N)如果你需要分别支持负数或浮动点。

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

1

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

0

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

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

2)当您使用两个或多个具有相同字段名称的表格时,请将EVERY字段名称作为其表名。 我做到了这一点,它的工作,你将在下面的完整查询中看到。

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”列是主键,“身份证”是一个独特的密钥唯一标识每个数字)

这里是新的代码

create table BESTQUATER 
select 
HUNDREDNUMBERS.uniqueid , 
HUNDREDNUMBERS.id, 
HUNDREDNUMBERS.numbers 
FROM 
HUNDREDNUMBERS 
group by HUNDREDNUMBERS.id 
ORDER BY HUNDREDNUMBERS.numbers DESC LIMIT 25