Задавайте вопросы, мы ответим
Вы не зашли.
ВСем привет.
Помогите плз нужно сделать произвольную сортировку.
Есть таблица
Tovar - id, name
И записи
1 товар1
2 товар2
3 товар3
4 товар4
Нужно выбрать все товары но на первые места поставить 3 и 1 а остальные по алфавиту
Неактивен
Зачем Вам это?!
select * from t_5551 ORDER BY ( if ( `name` = 'товар3', 2, if (`name` = 'товар1',1,0)) ) DESC, name ASC;
Неактивен
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
Как правильно сделать запрос
Неактивен
Похоже, мой вопрос про то, зачем это нужно, является коммерческой тайной?
SELECT * from t_5551 ORDER BY ( if ( `id` = 3, 2, if (`id` = 1,1,0)) ) DESC, name ASC;
Неактивен
deadka написал:
Похоже, мой вопрос про то, зачем это нужно, является коммерческой тайной?
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 будет сортировка
Неактивен
Нужно выбрать все товары но на первые места поставить 3 и 1 а остальные по алфавиту
Отсюда я и исходил в сортировке.
Сортируем по значениям, можно так сказать, динамически созданной колонки, которая принимает значение 2, если id = 3, принимает значение 1, если id = 1, и 0 во всех остальных случаях.
Если сортировка не та, то на примере покажите, какой результат Вам нужно получить.
Неактивен
deadka написал:
Нужно выбрать все товары но на первые места поставить 3 и 1 а остальные по алфавиту
Отсюда я и исходил в сортировке.
Сортируем по значениям, можно так сказать, динамически созданной колонки, которая принимает значение 2, если id = 3, принимает значение 1, если id = 1, и 0 во всех остальных случаях.
Если есть условие if с ортировке , mysql создает динамическую колонку? где про это можно прочитать плз
Неактивен
Какое решение является лучшем
1) Условия в сортировке - это повлечет за собой как нибудь не использовать индексы
2) Или заведения отдельной колонки
Неактивен
Выполнил запрос
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)
Неактивен
Про if можно почитать здесь. Про динамическую колонку - она неминуемо создастся, если сортировать не по столбцу уже существующему, а использовать такие извращенные конструкции в ORDER BY.
Что касается лучшего решения - и там и там свои плюсы и минусы.
Если завести отдельную колонку, то сортировать по ней, конечно же, будет быстрее, но ее надо будет обслуживать - менять там, например, значения, если "рейтинг" товара изменится.
Зависит от количества записей в Вашей таблице и того, насколько часто этот запрос будет выполняться. Опять же - если Вы выбираете все записи из таблицы, то ключ по новой колонке не поможет особо, а вот если первые 10 - то должен ускорить.
Неактивен
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, то есть по убыванию.
Неактивен
deadka написал:
Про if можно почитать здесь. Про динамическую колонку - она неминуемо создастся, если сортировать не по столбцу уже существующему, а использовать такие извращенные конструкции в ORDER BY.
Что касается лучшего решения - и там и там свои плюсы и минусы.
Если завести отдельную колонку, то сортировать по ней, конечно же, будет быстрее, но ее надо будет обслуживать - менять там, например, значения, если "рейтинг" товара изменится.
Зависит от количества записей в Вашей таблице и того, насколько часто этот запрос будет выполняться. Опять же - если Вы выбираете все записи из таблицы, то ключ по новой колонке не поможет особо, а вот если первые 10 - то должен ускорить.
Выбираются товары по 1 колонке WHERE is_main=1
Если у меня их сотни тысяч то лучше завести колонку потому что по ней будет индекс и выборка будет быстрой? нежели делать условия в сортировке, что тратит дополнительное время и ресурсы?
Неактивен
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, то есть по убыванию.
Точно (
Неактивен
nekulin написал:
Если у меня их сотни тысяч то лучше завести колонку потому что по ней будет индекс и выборка будет быстрой? нежели делать условия в сортировке, что тратит дополнительное время и ресурсы?
Да, если записей много, колонка будет проиндексирована и выборки будут вида ORDER BY new_column LIMIT небольшое число записей, то так будет эффективнее.
Неактивен
deadka написал:
nekulin написал:
Если у меня их сотни тысяч то лучше завести колонку потому что по ней будет индекс и выборка будет быстрой? нежели делать условия в сортировке, что тратит дополнительное время и ресурсы?
Да, если записей много, колонка будет проиндексирована и выборки будут вида ORDER BY new_column LIMIT небольшое число записей, то так будет эффективнее.
Спасибо большое, классный форум. И люди хорошие
Неактивен
Спасибо на добром слове, обращайтесь . По поводу рассуждений про производительность и эффективность - Вы попробуйте сравнить на больших количествах записей оба способа . И если при запросе используется условие is_main=1, то надо будет сделать не индекс на новое поле, а составной индекс (is_main,новое поле).
Неактивен