MySQL, сортировка
От: x64 Россия http://x64blog.name
Дата: 05.02.13 21:08
Оценка:
Привет.

Есть база MySQL, есть таблица и в ней целочисленное поле, в котором могут находиться значения 0..2, необходимо извлечь данные из этой таблицы по запросу, отсортировав записи по этому полю, при этом значения 0 и 1 должны при сортировке считаться идентичными, это как-то возможно сделать? Что-то не соображу никак. Понимаю, что это, вероятно, косяк проектирования, но такая уж база, какие есть варианты? Подойдёт любой workaround, желательно, конечно, без изменения структуры и данных.

Спасибо.
JID: x64j@jabber.ru
Re: MySQL, сортировка
От: Anton Batenev Россия https://github.com/abbat
Дата: 06.02.13 01:55
Оценка: 12 (1)
Здравствуйте, x64, Вы писали:

x64> Есть база MySQL, есть таблица и в ней целочисленное поле, в котором могут находиться значения 0..2, необходимо извлечь данные из этой таблицы по запросу, отсортировав записи по этому полю, при этом значения 0 и 1 должны при сортировке считаться идентичными, это как-то возможно сделать? Что-то не соображу никак. Понимаю, что это, вероятно, косяк проектирования, но такая уж база, какие есть варианты? Подойдёт любой workaround, желательно, конечно, без изменения структуры и данных.


Если решать задачу именно в указанной постановке, то простая сортировка по данному полю и даст нужный результат без к-л дополнительных манипуляций, т.к. последовательность сортируется в 0-1-2 (т.е. 0 и 1 всегда будут идти раньше 2 даже если мы 1 заменим на 0 или 0 на 1).

Однако, если перефразировать условие, скажем, считать 2 идентично 0, то можно попробовать что-то типа такого:

CREATE DATABASE `test`;

USE `test`;

CREATE TABLE `test` (
   `id` INTEGER NOT NULL,
   `value` TEXT NOT NULL
);

INSERT INTO `test` VALUES
(0, 'ноль-1'), (1, 'один-1'), (2, 'два-1'),
(2, 'два-2'),  (0, 'ноль-2'), (1, 'один-2'),
(1, 'один-3'), (2, 'два-3'),  (0, 'ноль-3');

SELECT
   IF(`id` = 2, 0, `id`) AS `id`,
   `value`
FROM
   `test`
ORDER BY
   `id`;


Если условий много, то можно IF заменить на CASE
avalon/1.0.432
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.