MySQL / PHP按自然排序排序

时间:2013-09-03 10:33:33

标签: php mysql arrays sorting natural-sort

我编写一个代码来对mysql字段值进行排序。 我的归档值如下

**downloads**
N/A
10

50
30
unlimited
N/A
70
unlimited

那些是在mysql表字段上。 我需要按照下面的方式对那些同意和降序进行排序

Assending
N/A

10
30
50
70
unlimited
unlimited


Desending
unlimited
unlimited
70
50
30
10

N/A

空间是一些行没有数据。我写了如下的mysql查询

SELECT * FROM fltable  ORDER BY LENGTH(downloads), downloads DESC

但这不会返回正确的排序,任何人都可以使用我的sql或php解决方案来帮助我。 谢谢

4 个答案:

答案 0 :(得分:2)

升值使用:

SELECT downloads, (CASE WHEN downloads = 'N/A' THEN 0 
                        WHEN downloads = '' THEN 1 
                        WHEN downloads='unlimited' THEN 4 
                        ELSE 3 END) as rank 
       FROM fltable 
       ORDER BY rank ASC;

对于降值使用:

SELECT downloads, (CASE WHEN downloads = 'N/A' THEN 0 
                        WHEN downloads = '' THEN 1 
                        WHEN downloads='unlimited' THEN 4 
                        ELSE 3 END) as rank 
       FROM fltable 
       ORDER BY rank, downloads DESC;

答案 1 :(得分:1)

SELECT * FROM fltable  
ORDER BY case when downloads = 'N/A' then 1
              when downloads is null then 2
              when downloads = 'unlimited' then 4
              else 3
         end DESC, 
         downloads * 1 DESC

答案 2 :(得分:0)

  • 我知道,这个解决方案与SQL中的另一个解决方案非常相似。

您可以使用usort来实现您需要的任何逻辑。

define('DV_NA', 1);
define('DV_EMPTY', 2);
define('DV_NUM', 3);
define('DV_UNLIMITED', 4);
define('DV_OTHER', 5);

function customDloadValue($n) {
  switch($n) {
  case "N/A": return DV_NA;
  case null: case "": return DV_EMPTY;
  case "unlimited": return DV_UNLIMITED;
  default: return is_numeric($n) ? DV_NUM : DV_OTHER;
  }
}

usort($strings, function ($a, $b) {
  $av = customDloadValue($a);
  $bv = customDloadValue($b);
  if ($av != DV_NUM or $bv != DV_NUM) return $av - $bv;
  return intval($a) - intval($b)
});

答案 3 :(得分:0)

另一种类似的方式:

SELECT download, (download= 'N/A') boolNA, (download= '') boolBlank, 
       (download+0 > 0) boolNum, (download= '0') boolZero 
FROM table 
ORDER BY boolNA DESC, boolBlank DESC, boolZero DESC, boolNum DESC, 
         (download+0), download

这样,您就可以创建要排序的组。

这可能导致类似:

N/A

10
30
50
70
unlimited
unlimited

与上述结果相同,方式不同。如果您只需要分组一些数据类型(少于3个),则可能更容易。