MySQL/PHP排序与自然排序
我正在编写一个代码来对mysql字段值进行排序。 我的归档值如下所示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
**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版本问题