SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 06.04.2012 20:24:26

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Сортировка

ВСем привет.
Помогите плз нужно сделать произвольную сортировку.

Есть таблица

Tovar - id, name

И записи

1 товар1
2 товар2
3 товар3
4 товар4

Нужно выбрать все товары но на первые места поставить 3 и 1 а остальные по алфавиту

Неактивен

 

#2 06.04.2012 22:57:55

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка

Зачем Вам это?!

select * from t_5551 ORDER BY ( if ( `name` = 'товар3', 2, if (`name` = 'товар1',1,0)) ) DESC, name ASC;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 07.04.2012 11:13:09

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Re: Сортировка

deadka написал:

Зачем Вам это?!

select * from t_5551 ORDER BY ( if ( `name` = 'товар3', 2, if (`name` = 'товар1',1,0)) ) DESC, name ASC;

Нет нужно просто ид
SELECT * FROM `tovar`
ORDER BY 3,4,5
LIMIT 10

Как правильно сделать запрос

Неактивен

 

#4 07.04.2012 11:16:14

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка

Похоже, мой вопрос про то, зачем это нужно, является коммерческой тайной? wink
SELECT * from t_5551 ORDER BY ( if ( `id` = 3, 2, if (`id` = 1,1,0)) ) DESC, name ASC;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 07.04.2012 11:39:38

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Re: Сортировка

deadka написал:

Похоже, мой вопрос про то, зачем это нужно, является коммерческой тайной? wink
SELECT * from t_5551 ORDER BY ( if ( `id` = 3, 2, if (`id` = 1,1,0)) ) DESC, name ASC;

Просто нужно некоторые товары поставить на 1 места, но для это отдельный столбец не очень охота заводить.
ВЫ можете обьеснить свой код пожалуйста

( if ( `id` = 3, 2, if (`id` = 1,1,0)) )
Если id равен 3 то 2 если id равен 1 то 1 иначе 0

значения
0
1
2
Какую роль сыграют? получается у нас только по id 3 и 1 будет сортировка

Неактивен

 

#6 07.04.2012 11:42:37

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка

Нужно выбрать все товары но на первые места поставить 3 и 1 а остальные по алфавиту

Отсюда я и исходил в сортировке.

Сортируем по значениям, можно так сказать, динамически созданной колонки, которая принимает значение 2, если id = 3,  принимает значение 1, если id = 1, и 0 во всех остальных случаях.

Если сортировка не та, то на примере покажите, какой результат Вам нужно получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 07.04.2012 11:44:13

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Re: Сортировка

deadka написал:

Нужно выбрать все товары но на первые места поставить 3 и 1 а остальные по алфавиту

Отсюда я и исходил в сортировке.

Сортируем по значениям, можно так сказать, динамически созданной колонки, которая принимает значение 2, если id = 3,  принимает значение 1, если id = 1, и 0 во всех остальных случаях.

Если есть условие if с ортировке , mysql создает динамическую колонку? где про это можно прочитать плз

Неактивен

 

#8 07.04.2012 11:45:27

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Re: Сортировка

Какое решение является лучшем
1) Условия в сортировке - это повлечет за собой как нибудь не использовать индексы
2) Или заведения отдельной колонки

Неактивен

 

#9 07.04.2012 11:48:52

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Re: Сортировка

Выполнил запрос
SELECT * FROM `tovar`
ORDER BY if(id=3, 1,0)
LIMIT 10

по условию 1, но нету товара с id 3 куда он пропал. ( Т.е если мы укажем 1 в сортировке то этой записи не будет или что не догнал (

Но а если выполнить запрос
SELECT *
FROM `tovar`
WHERE id IN (3,4)
ORDER BY if(id=3, 1,0)

То 3 встанет на последнее место все верно, а почему то в 1 запросе он вообще пропал

Отредактированно nekulin (07.04.2012 11:50:55)

Неактивен

 

#10 07.04.2012 11:50:36

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка

Про if можно почитать здесь. Про динамическую колонку - она неминуемо создастся, если сортировать не по столбцу уже существующему, а использовать такие извращенные конструкции в ORDER BY.

Что касается лучшего решения - и там и там свои плюсы и минусы.
Если завести отдельную колонку, то сортировать по ней, конечно же, будет быстрее, но ее надо будет обслуживать - менять там, например, значения, если "рейтинг" товара изменится.
Зависит от количества записей в Вашей таблице и того, насколько часто этот запрос будет выполняться. Опять же - если Вы выбираете все записи из таблицы, то ключ по новой колонке не поможет особо, а вот если первые 10 - то должен ускорить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 07.04.2012 11:53:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка

nekulin написал:

Выполнил запрос
SELECT * FROM `tovar`
ORDER BY if(id=3, 1,0)
LIMIT 10

по условию 1, но нету товара с id 3 куда он пропал. ( Т.е если мы укажем 1 в сортировке то этой записи не будет или что не догнал (

Естественно пропал, ведь if вернет 1 только в случае, если id = 3, в иных случаях он вернет 0, а Вы выбираете 10 элементов по возрастанию if. 1-чка - это последний элемент при такой сортировке. Сделайте ORDER BY ... DESC, то есть по убыванию.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#12 07.04.2012 11:54:08

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Re: Сортировка

deadka написал:

Про if можно почитать здесь. Про динамическую колонку - она неминуемо создастся, если сортировать не по столбцу уже существующему, а использовать такие извращенные конструкции в ORDER BY.

Что касается лучшего решения - и там и там свои плюсы и минусы.
Если завести отдельную колонку, то сортировать по ней, конечно же, будет быстрее, но ее надо будет обслуживать - менять там, например, значения, если "рейтинг" товара изменится.
Зависит от количества записей в Вашей таблице и того, насколько часто этот запрос будет выполняться. Опять же - если Вы выбираете все записи из таблицы, то ключ по новой колонке не поможет особо, а вот если первые 10 - то должен ускорить.

Выбираются товары по 1 колонке WHERE is_main=1
Если у меня их сотни тысяч то лучше завести колонку потому что по ней будет индекс и выборка будет быстрой? нежели делать условия в сортировке, что тратит дополнительное время и ресурсы?

Неактивен

 

#13 07.04.2012 11:54:53

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Re: Сортировка

deadka написал:

nekulin написал:

Выполнил запрос
SELECT * FROM `tovar`
ORDER BY if(id=3, 1,0)
LIMIT 10

по условию 1, но нету товара с id 3 куда он пропал. ( Т.е если мы укажем 1 в сортировке то этой записи не будет или что не догнал (

Естественно пропал, ведь if вернет 1 только в случае, если id = 3, в иных случаях он вернет 0, а Вы выбираете 10 элементов по возрастанию if. 1-чка - это последний элемент при такой сортировке. Сделайте ORDER BY ... DESC, то есть по убыванию.

Точно (

Неактивен

 

#14 07.04.2012 12:02:29

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка

nekulin написал:

Если у меня их сотни тысяч то лучше завести колонку потому что по ней будет индекс и выборка будет быстрой? нежели делать условия в сортировке, что тратит дополнительное время и ресурсы?

Да, если записей много, колонка будет проиндексирована и выборки будут вида ORDER BY new_column LIMIT небольшое число записей, то так будет эффективнее.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#15 07.04.2012 12:06:51

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Re: Сортировка

deadka написал:

nekulin написал:

Если у меня их сотни тысяч то лучше завести колонку потому что по ней будет индекс и выборка будет быстрой? нежели делать условия в сортировке, что тратит дополнительное время и ресурсы?

Да, если записей много, колонка будет проиндексирована и выборки будут вида ORDER BY new_column LIMIT небольшое число записей, то так будет эффективнее.

Спасибо большое, классный форум. И люди хорошие smile

Неактивен

 

#16 07.04.2012 12:16:40

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка

Спасибо на добром слове, обращайтесь smile. По поводу рассуждений про производительность и эффективность - Вы попробуйте сравнить на больших количествах записей оба способа smile. И если при запросе используется условие is_main=1, то надо будет сделать не индекс на новое поле, а составной индекс (is_main,новое поле).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson