使用php和mysql高级排序和搜索mysql数据库
我正面临一个独特的挑战。使用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中的数据作进一步处理。
任何帮助是极大的赞赏
如果你只有100个号码,我会建议你创建一个级别的视图,并用它进行后续处理。采用中间表,似乎有点小题大做:
select hn.*,
(select count(*) from hundrednumbers hn2 where hn2.number <= hn.number
) as rank
from HundredNumbers hn
随着hundrednumbers(number)
索引,这甚至将有不俗的表现。
您可能遇到的问题在原始数据中是重复的。如果是这样,查看队伍可以帮助你找出在这种情况下要做什么。
你正在做字符串比较,那些比数字数据类型遵循不同的规则;我建议改变你的排序表达式:
ORDER BY CAST(HUNDREDNUMBERS.number AS UNSIGNED) DESC|ASC
相反UNSIGNED
,你也可以使用SIGNED
或DECIMAL(M, N)
如果你需要分别支持负数或浮动点。
或者(最好),您可以将number
列更改为一种自行排序正确的类型;主要应该使用VARCHAR
作为文本。
您应该检查数据类型。确保数字至少保存一位小数。其他数据类型可能导致排序关闭(并且是一个相当常见的错误)。这看起来很简单,但你的代码实际上从我的理解是这个问题看起来是正确的。
经过长时间的思考和测试,我相信我终于破解了它。
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
当它是不是100%正确,会发生什么? – 2013-04-08 12:51:21
它返回错误的数字。例如BESTQUARTER表包含偶数小于25.因此WORSTQUARTERS包含的数字高于75 – lloyd 2013-04-08 12:54:31
字段的类型是什么decimal or varchar? – 2013-04-08 12:54:57