Перейти к содержимому

MOAB

- - - - -

mysql - Сортировка по полю с коэффициентом.


  • Войдите, чтобы ответить
Сообщений в теме: 11

#1 protector

protector

    Почетный

  • Основатель
  • PipPipPipPipPip
  • 3 450 сообщений
2 062
  • ИзСанкт-Петербурга

Отправлено 10 Сентябрь 2020 - 10:16

Мне нужно написать sql запрос с сортировкой по полю, умноженному на коэффициент. Сейчас у меня примерно так

Цитата

SELECT ID,Skidka,Price FROM table order by Price
В поле Price - текущая цена товара. Если есть скидка (Skidka), то в поле Price стоит большая цена, а реальную цену для вывода на экран вычисляю как Price*Skidka. Требуется сортировка по реальной (более низкой) цене. То есть примерно такой запрос

Цитата

SELECT ID,Skidka,Price FROM table order by (Price*Skidka)
Как правильно написать?

Вот пример товаров, как хранятся в базе:

Цитата

Товар1 - 1000руб - скидка 0%
Товар2 - 2000руб - скидка 20%
Товар3 - 2010руб - скидка 30%

Нужно вывести их отсортированными по реальным ценам:

Цитата

Товар1 - 1000руб
Товар3 - 2010руб (2010*0,7=1407 руб)
Товар2 - 2000руб (2000*0,8=1600 руб)

Знаю, скажете, что изначально неправильно храним данные в базе, что в поле Price нужно хранить меньшую цену. А большую - уже вычислять в пхп. Но как сейчас быть?

Мой вариант: всё в массив, потом вычислять меньшую цену и сортировать многомерный массив. Но не нравится, что эта манипуляция займет секунды две.. Сайт будет долго открываться.

#2 Serg_pnz

Serg_pnz

    Hanswurst

  • Старая гвардия
  • PipPipPipPipPip
  • 2 114 сообщений
1 768
  • Из*** гонец? Гонец из Пензы?... Нет – реальный гонец!

Отправлено 10 Сентябрь 2020 - 15:58

А добавить поле с Price*Skidka не вариант?

Хотя бы даже в отдельной таблице и связать по id

или так
SELECT
  prims.id,
  prims.woid,
  prims.prid,
  prims.woid * prims.prid AS ddd
FROM prims
ORDER BY ddd

Не все кальсоны с оторванными пуговицами – брюки. © Serg_pnz

#3 c4e8ece0

c4e8ece0

    Ниггер на лошади

  • Участник
  • PipPipPipPipPip
  • 5 210 сообщений
6 688
  • Изцирка

Отправлено 10 Сентябрь 2020 - 18:01

Если товаров пара тысяч, то можно прям как и хотел. Если есть нагрузка и товаров десятки и сотни тысяч, то:
  • Надо сделать поле с конечной ценой как написал Serg_pnz (обновлять можно без заморок пересчитывая по необходимости через UPDATE table SET sortprice=cost*sale)
  • Добавить обычный индекс на это поле
  • В запросе на SELECT добавить FORCE INDEX (этот_новый_индекс)
  • Проверить отсутствие FILESORT, WHERE и FULLSCAN в EXPLAIN на полном запросе (чтобы не было левых операций кроме использования нужных индексов, короче)
  • Если левые операции есть, то, возможно, стоит помозговать как от них избавиться с помощью более широких индексов. Иногда индексы могут быть сильно больше самих данных, но на что не пойдёшь ради перформанса. Пам-парам-пам-пам – вот что я люблю!

"Они не могут ничего, у них лапки котят"

#4 protector

protector

    Почетный

  • Основатель
  • PipPipPipPipPip
  • 3 450 сообщений
2 062
  • ИзСанкт-Петербурга

TC Отправлено 10 Сентябрь 2020 - 18:21

Просмотр сообщенияSerg_pnz (10 Сентябрь 2020 - 15:58) писал:

SELECT
prims.id,
prims.woid,
prims.prid,
prims.woid * prims.prid AS ddd
FROM prims
ORDER BY ddd
Да, Именно так я и сделал. Оказалось всё очень просто. Даже не ожидал.

Просмотр сообщенияSerg_pnz (10 Сентябрь 2020 - 15:58) писал:

А добавить поле с Price*Skidka не вариант?
Отдельное поле в базу? Не вариант. У меня цены автоматически подтягиваются с другого сайта (из другой базы). Будет вредно для синхронизации. Либо переделывать.. но можно подумать.

Просмотр сообщенияc4e8ece0 (10 Сентябрь 2020 - 18:01) писал:

Если товаров пара тысяч, то можно прям как и хотел. Если есть нагрузка и товаров десятки и сотни тысяч, то:
Нет. Товаров меньше 1000 - около 400 пока что. Но у каждого товара куча размеров (около 100) и у каждого размера своя цена. Поэтому 2 таблицы в базе: с товаром и цены, которые соединяю в запросе (ну и ряд других таблиц соединяю)

Итоговый запрос выполняется 0,05-0.19сек. Пойдет в зависимости от доп.условий.

#5 c4e8ece0

c4e8ece0

    Ниггер на лошади

  • Участник
  • PipPipPipPipPip
  • 5 210 сообщений
6 688
  • Изцирка

Отправлено 13 Сентябрь 2020 - 22:04

Просмотр сообщенияprotector сказал:

Пойдет в зависимости от доп.условий.
Типа "нам насрать на скорость"? :D
"Они не могут ничего, у них лапки котят"

#6 protector

protector

    Почетный

  • Основатель
  • PipPipPipPipPip
  • 3 450 сообщений
2 062
  • ИзСанкт-Петербурга

TC Отправлено 14 Сентябрь 2020 - 09:48

Просмотр сообщенияc4e8ece0 (13 Сентябрь 2020 - 22:04) писал:

Типа "нам насрать на скорость"? :D
Данный запрос выполняется не более 0,2сек. На мой взгляд, пойдет. Это терпимо. По крайней мере точно невысокий приоритет переделки.

#7 c4e8ece0

c4e8ece0

    Ниггер на лошади

  • Участник
  • PipPipPipPipPip
  • 5 210 сообщений
6 688
  • Изцирка

Отправлено 15 Сентябрь 2020 - 01:06

Просмотр сообщенияprotector (14 Сентябрь 2020 - 09:48) писал:

Данный запрос выполняется не более 0,2сек. На мой взгляд, пойдет. Это терпимо. По крайней мере точно невысокий приоритет переделки.
Это понятно, поэтому то ты и пытаешься топить конкурентов :D
"Они не могут ничего, у них лапки котят"

#8 protector

protector

    Почетный

  • Основатель
  • PipPipPipPipPip
  • 3 450 сообщений
2 062
  • ИзСанкт-Петербурга

TC Отправлено 15 Сентябрь 2020 - 11:18

Просмотр сообщенияc4e8ece0 (15 Сентябрь 2020 - 01:06) писал:

Это понятно, поэтому то ты и пытаешься топить конкурентов :D
Данный запрос - самый тяжелый у меня. Общее время загрузки сайта (точнее работы скриптов: определяю как разницу первой строчки $start1 = microtime(true); и последней $end1 = microtime(true) ) - от 0,2сек до 0,44сек. В большинстве случаев - это 0,2сек до 0,35сек.

Это много?

#9 c4e8ece0

c4e8ece0

    Ниггер на лошади

  • Участник
  • PipPipPipPipPip
  • 5 210 сообщений
6 688
  • Изцирка

Отправлено 15 Сентябрь 2020 - 13:15

Просмотр сообщенияprotector сказал:

Это много?
Терпимо. Но это неправильный вопрос.
"Они не могут ничего, у них лапки котят"

#10 protector

protector

    Почетный

  • Основатель
  • PipPipPipPipPip
  • 3 450 сообщений
2 062
  • ИзСанкт-Петербурга

TC Отправлено 15 Сентябрь 2020 - 16:07

Просмотр сообщенияc4e8ece0 (15 Сентябрь 2020 - 13:15) писал:

Терпимо. Но это неправильный вопрос.
А какой правильный вопрос? Можно сделать лучше? Совершенству нет предела...

#11 protector

protector

    Почетный

  • Основатель
  • PipPipPipPipPip
  • 3 450 сообщений
2 062
  • ИзСанкт-Петербурга

TC Отправлено 07 Октябрь 2020 - 11:04

Просмотр сообщенияc4e8ece0 (15 Сентябрь 2020 - 13:15) писал:

Терпимо. Но это неправильный вопрос.
После вашего сообщения и после прочтения инета решил сменить устаревший php 5.6 на php 7.4 , типа давно уже пора. Для этого перешел с mysql на mysqli. Последнее было самое долгое в переходе.
Что удивительно, но реально сайт стал на 30% быстрее работать. Всё это, конечно, доли секунд, но реально быстрее. Теперь я вписываюсь в рекомендации Гугла по загрузке сайта до 300мс. Все страницы загружаются от 50 до 300мс.
При этом спустя всего 1- 2 неделе в панеле Яндекс.Вебмастера показатель "индекс скорости сайта" вырос с 4 единиц (из 5) до 5 из 5.

Наверное, нужно и остальные сайты переводить на php 7

#12 c4e8ece0

c4e8ece0

    Ниггер на лошади

  • Участник
  • PipPipPipPipPip
  • 5 210 сообщений
6 688
  • Изцирка

Отправлено 07 Октябрь 2020 - 17:06

Просмотр сообщенияprotector сказал:

При этом спустя всего 1- 2 неделе в панеле Яндекс.Вебмастера показатель "индекс скорости сайта" вырос с 4 единиц (из 5) до 5 из 5.
А вдруг это плохо? (там же машинное обучение, а дорвейщики, классически, впереди планеты всей по скорости, чистоте кода и прочему сео-шмео) :D
"Они не могут ничего, у них лапки котят"



Похожие темы


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных



© 2020 SMO&SEO форум «WEBIMHO» — продвижение и создание сайтов, интернет-маркетинг

По вопросам рекламы на форуме и цены на рекламу
Все материалы SEO форума разрешены к копированию только с установкой гиперактивной ссылки на webimho.ru,
тем, кто этого не сделает, мы оторвем руки и ноги и поменяем местами,
а когда выйдем из тюрьмы, опять оторвем и опять поменяем.


Россия, г. Москва
  • Top.Mail.Ru

Мы в соцсетях: twitter | вконтакте | facebook | livejournal