2013-07-22 7 views
3

У меня есть таблица продуктов, которая имеет следующую структуру.MYSQL Сортировать по:

ProductID  ProductName  ProductType 
    1    Irrigation  1 
    2    Landscape  2 
    3    Sleeving  3 
    4    Planting  4 

Теперь мне нужно возвращает строки в порядке типа продукта 3,2,4,1 Для этого я использовал метод MYSQL FIELD, который прекрасно работает, как это

Select * from product order by FIELD(producttype,3,2,4,1) 

Это работает отлично,

Моя проблема в том, что имя продукта пусто для типа продукта 3, тогда оно должно принимать следующее имя продукта, которое не является пустым, поэтому в таком случае порядок результата должен быть 2,4,1,3.

Так первое условие записи должны быть в следующем порядке типа продукта

Sleeving  3 
Landscape  2 
Planting  4 
Irrigation 1     

Но если Название продукта для ProductType 3 пусто, то заказ нужно быть

Landscape  2 
Planting  4 
Irrigation 1 
       3 

И далее Productname для ProductType 2 пуст, тогда заказ должен быть

Planting  4 
Irrigation 1 
       3 
       2 

Из этого результата Мне просто нужно выбрать первую запись.

Я надеюсь, что я очистить мою точку

Любая помощь будет оценена

+0

Можно ли добавить столбец с порядком последовательности? если да, вам просто нужно отфильтровать пустые имена через предложение where и порядок в столбце новой последовательности, ограниченный 1 –

ответ

0

Это будет удовлетворять спецификации:

ORDER BY NULLIF(ProductName,'') IS NULL, FIELD(producttype,3,2,4,1) 

Первое выражение будет возвращать 1, если ProductName «пуст» (NULL или нулевая длина st ring '), в противном случае он вернется 0.

Итак, сначала будет отсортировано все непустое ProductName, за которым следует пустое ProductName.

И после этого, он будет сортировать по оригинальному выражению.

Обратите внимание, что этот подход сохраняет первоначально заданный порядок, если существует два или более (или все) пустых ProductName.

(Тест на "пустой" может быть расширена, чтобы включить другие случаи, например, с помощью TRIM() функцию, а также.


выражение

NULLIF(ProductName,'') IS NULL 

является сокращением, это эквивалент SQL-92 совместимый: (. есть и другие способы, чтобы получить тот же результат)

CASE WHEN ProductName = '' OR ProductName IS NULL THEN 1 ELSE 0 END 

+0

Это действительно отлично работает ... –

1
Select * from product order by 
ISNULL(PRODUCTNAME),FIELD(producttype,3,2,4,1); 

fiddle

+0

. Я не думаю, что это работает в последнем случае. – Starx

+0

http://www.sqlfiddle.com/#!2/fa18a/1 .. см. Скрипку. Пожалуйста, будьте более ясны в разделе «позже». –

+0

Это, кажется, работает отлично, спасибо –

0

Должно работать!

SELECT * FROM product ORDER BY FIELD(IF(ProductName is null,0,producttype),1,3,2,5) 
-1

Вы можете попробовать этот

Select * из продукта, где ProductName! = '' Порядка по полю (ProductType, 3,2,4,1)

+0

Это исключает строки. Я думаю, что ОР хотел, чтобы упорядоченные строки не были отфильтрованы. – spencer7593

0

Это очень сложный вопрос и никогда не будет [править] работать как вам нужно, потому что он должен идентифицировать следующее значение в другой строке, которая может быть чем угодно. Это возможно с помощью представлений, функций, поворота и многих объединений, но, как число строк, я не думаю, что это может дать результат.

Однако, чтобы прямо ответить, ДА ORDER BY с футляром можно

Select * from product order by 
    CASE WHEN productname IS NULL then FIELD(producttype, 2, 4, 1, 3) 
    CASE WHEN productname IS NOT NULL THEN FIELD(producttype, 3, 2, 4, 1) 

Опять Это не полный запрос и не является решением

Если ваши строки ограничены вами можно связать ваши запросы следующим образом:

Select * from product order by 
    CASE WHEN productname IS NULL then FIELD(producttype, 2, 4, 1, 3) 
    CASE WHEN (SELECT productname n FROM product WHERE producttype = '2') IS NULL THEN FIELD (4, 1, 3, 2) 

Как вы видите, я зафиксировал t он запрашивает поиск строки с «2» в качестве типа продукта. Вы можете узнать их, сделав еще один запрос и поместив его в основной запрос.

Опять же, не обязательно, обработать серверную часть рядов, это будет очень легко, чем это.

Смежные вопросы