2013-09-03 4 views
0

Я пишу код, чтобы отсортировать значения полей mysql. мои поданные значения, как показано нижеMySQL/PHP Сортировка с естественной сортировкой

**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 решение. Спасибо

ответ

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 
+0

спасибо я написал запрос, но получаю синтаксическую ошибку SELECT * FROM fltable WHERE 1 = 1 ORDER BY случае, когда Offpeak = 'N/A', то 1 случай, когда Offpeak равна нулю, то 2 случай, когда Offpeak = 'unlimited' then 4 else 3 END, Offpeak * 1 DESC LIMIT 0,29 ошибка У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего MySQL-сервера, для правильного синтаксиса для использования около «случая, когда Offpeak имеет значение null, а затем 2 случай, когда Offpeak = 'unlimited' then 'at line 3 вы можете мне помочь –

+0

Я исправил эту опечатку , Вам нужен только один 'case' с несколькими' when '. –

+0

Структура запроса неверна, если используется после ORDER BY – Salim

0
  • Я знаю, это решение очень похоже на другой в 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) 
}); 
2

Для assending использовать значение:

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; 

Для desending использовать значение:

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; 
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), которые вам нужно группировать, может быть проще.