Mysql порядок сортировки - PullRequest
0 голосов
/ 11 июня 2019

У меня есть 1 таблица с идентификаторами столбцов, именем и угрозой, и я хочу использовать порядок по пунктам для столбцов угроз.

Угроза 1 имеет самый высокий приоритет, а 5 - самый низкий. Немногие записи не будут иметь оценку угрозы и иметь нулевое значение в качестве оценки.

Следовательно, при отображении его на экране вычитается оценка угрозы с числовым значением 6 (если угроза имеет значение), и то же самое будет использоваться в качестве оценки угрозы.

При сортировке угрозы столбца по asc, он выбирает первые нулевые значения (без угрозы) и сортирует по desc, выбирая первое значение как 5 (самая низкая угроза).

Следовательно, последний порядок на экране (после вычитания на 6) для ASC. Если вы видите здесь, оценка угрозы с 5, показанная как верхняя, потому что запись отправки SQL отсортирована по оценке угрозы.

+-------------+------------+
| screen data | Table data |
+-------------+------------+
|    NULL     |     Null   |
|     1       |      5     |
|     2       |      4     |
|     3       |      3     |
|     4       |      2     |
|     0       |      0     |
+-------------+------------+

Уже пробовал ORDER BY threat * -1 ASC, но выдает ошибку

Ошибка BigInt без знака вне диапазона

Здесь мое требование - получить оценку угрозы с 1 в качестве верхней записи при сортировке записей, потому что NULL имеет прецеденты над ней.

Ожидаемое поведение для сортировки (ASC или desc)

+--------+
| Threat | 
+--------+
|   1    |
|   2    |
|   3    |
|   4    |
|   5    |
|   0    |
|  NULL  |
+--------+

- рабочий раствор -

С помощью замечательных людей, приведенное ниже решение работает как шарм.

ORDER BY IF (threat=0,6, ifnull(threat,6)) ASC ; 

Ответы [ 5 ]

2 голосов
/ 11 июня 2019

В этом случае вы должны обработать NULL значения. Есть несколько способов обработки значений NULL. Вы можете изменить значение по умолчанию на некоторое число, которое подходит для вашего использования, в этом случае значения NULL исчезнут, и ваша проблема будет решена. Другое решение - иметь значения NULL, но обрабатывать их при запросе к таблице. Вы можете использовать IFNULL(expression, alt_value), в вашем случае это будет:

IFNULL(threat, 6)

Если схема:

CREATE TABLE IF NOT EXISTS `threat_table` (
  `id` int(3) unsigned ,
  `name` varchar(200),
  `threat` int(3) unsigned
) DEFAULT CHARSET=utf8;

INSERT INTO `threat_table` (`id`, `name`, `threat`) VALUES
  ('1', 'test1', '5'),
  ('2', 'test2', NULL),
  ('3', 'test3', '4'),
  ('4', 'test4', '3'),
  ('5', 'test5', '2'),
  ('6', 'test6', '1');

и ваш запрос:

SELECT * from table order by IFNULL(threat, 6)

тогда результат удовлетворительный:

+----+-------+--------+
| id | name  | threat |
+----+-------+--------+
|  6 | test6 | 1      |
|  5 | test5 | 2      |
|  4 | test4 | 3      |
|  3 | test3 | 4      |
|  1 | test1 | 5      |
|  2 | test2 | (null) |
+----+-------+--------+

взгляните на эту скрипку .

Обновление:

Если номер угрозы может иметь любое значение, отличное от [1..5], мы можем использовать этот запрос:

select * from threat_table order by IFNULL(threat, ~0 >> 33)
1 голос
/ 11 июня 2019
SELECT *       
FROM TableName
ORDER BY (CASE
            WHEN ColumnName IS NULL THEN 1 
            ELSE 0 
          END), 
         ColumnName

Надеюсь, это сработает.

1 голос
/ 11 июня 2019

Пожалуйста, используйте функцию ifnull(). Замените null значение подходящим значением в запросе выбора.

0 голосов
/ 11 июня 2019
ORDER BY column_name IS NULL, column_name ASC

Вы также можете использовать функцию mysql COALESCE См. Документацию здесь

0 голосов
/ 11 июня 2019

попытайтесь привести ваше значение к signed

order by cast(-1 *coalesce(Threat,0) as signed)

и coalesce(Threat,0) означает преобразование нулевого значения внизу.

...