我编写一个代码来对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解决方案来帮助我。 谢谢
答案 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)
您可以使用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个),则可能更容易。