【问题标题】:Advanced sorting and searching a mysql database using php and mysql使用 php 和 mysql 进行高级排序和搜索 mysql 数据库
【发布时间】:2013-04-10 22:33:33
【问题描述】:

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

我有一个名为 HUNDREDNUMBERS 的包含 100 个数字的表格。 我想选择最好的季度(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% 正确,会发生什么?
  • 它返回错误的数字。例如,BESTQUARTER 表包含小于 25 的偶数。因此,WORSTQUARTERS 包含大于 75 的数字
  • 字段的类型是十进制还是varchar???
  • 75 到 100 包括我们的 26 个数字。这样的事情是否会导致您认为偶尔出现错误?
  • 字段类型为VARCHAR(50)

标签: php mysql


【解决方案1】:

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

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

如果您需要分别支持负数或浮点数,也可以使用SIGNEDDECIMAL(M, N) 而不是UNSIGNED

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      使用hundrednumbers(number) 上的索引,这甚至会有不错的性能。

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

      【讨论】:

        【解决方案4】:

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

        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
        

        【讨论】:

          猜你喜欢
          • 2017-06-02
          • 1970-01-01
          • 1970-01-01
          • 2011-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多