MySQL/PHP排序与自然排序

MySQL/PHP排序与自然排序,php,mysql,arrays,sorting,natural-sort,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 SELECT * FROM fltable ORDER

我正在编写一个代码来对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
SELECT * FROM fltable  ORDER BY LENGTH(downloads), downloads DESC
空间是一些没有数据的行。我编写了如下mysql查询

Assending
N/A

10
30
50
70
unlimited
unlimited


Desending
unlimited
unlimited
70
50
30
10

N/A
SELECT * FROM fltable  ORDER BY LENGTH(downloads), downloads DESC
但这并没有返回正确的排序,任何人都可以使用我的sql或php解决方案来帮助我。 谢谢

  • 我知道,这个解决方案与SQL中的另一个非常相似
您可以使用来实现所需的任何逻辑

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)
});
  • 我知道,这个解决方案与SQL中的另一个非常相似
您可以使用来实现所需的任何逻辑

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)
});

用于确认价值的用途:

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;
对于终止值使用:

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;

用于确认价值的用途:

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;
对于终止值使用:

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;
另一种类似的方式:

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个),可能会更容易。

另一种类似的方式:

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个),可能会更容易。

谢谢我写了一个查询,但它会从fltable中得到语法错误SELECT*,其中1=1,Offpeak='N/a'时按案例排序,Offpeak为null时为1个案例,Offpeak='unlimited'时为2个案例,其余4个3结束,Offpeak*1 DESC LIMIT 0,29错误您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解正确的语法,以便在第3行的“Offpeak为null时使用case,Offpeak为null时使用case,Offpeak为null时使用case,Offpeak为'unlimited'时使用case,然后使用'unlimited'时使用2 case,您能帮助我吗。当s时,您只需要一个案例和多个案例。谢谢,按降序排序时,该案例不会出现任何错误。结果正常,但同意订单排序它是无限制的,首先你们可以检查这里的行,当我点击offpeak时,我们可以看到that@SunethKalhara:您需要在
order by
中的两条语句上使用
DESC
关键字。查看我的更新。@juergend:它在我的控制台中不工作。可能是mysql版本issuethanks我写了一个查询,但它得到语法错误SELECT*FROM fltable,其中1=1当Offpeak='N/a'时按大小写顺序,然后1当Offpeak为空,然后2当Offpeak='unlimited'时,然后4其他3结束,Offpeak*1 DESC LIMIT 0,29错误您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解正确的语法,以便在第3行的“Offpeak为null时使用case,Offpeak为null时使用case,Offpeak为null时使用case,Offpeak为'unlimited'时使用case,然后使用'unlimited'时使用2 case,您能帮助我吗。当s时,您只需要一个案例和多个案例。谢谢,按降序排序时,该案例不会出现任何错误。结果正常,但同意订单排序它是无限制的,首先你们可以检查这里的行,当我点击offpeak时,我们可以看到that@SunethKalhara:您需要在
order by
中的两条语句上使用
DESC
关键字。查看我的更新。@juergend:它在我的控制台中不工作。可能是mysql版本问题