Gloobus Опубликовано 19 марта, 2014 Жалоба Поделиться Опубликовано 19 марта, 2014 Может быть делал кто нибудь сортировку по популярности?Представляю ее как список товаров от самых покупаемых к менее покупаемым на основе заказов с типом "Выполнены" или "Новые", исключая "Удаленные" Самому сделать не проблема, я просто думал может если кто делал и не жалко, поделится запросиком, мне больше не надо Цитата Ссылка на сообщение Поделиться на другие сайты
Gloobus Опубликовано 20 марта, 2014 Автор Жалоба Поделиться Опубликовано 20 марта, 2014 Ответов не было, неужели никто не делал? В общем попробовал накалякать запрос, которые будет подсчитывать кол-во проданного товара по следующим условиям:1. Считаем только "Выполненные" заказы2. Если в заказе несколько вариантов данного товара, считаем как одну продажу Вроде все. Я попробовал "на лету" считать и выдавать результат, запрос работает около 0,4 сек, при наличии в s_purchases порядка 130к записей. Результат не устроил. решено было писать bash: #!/bin/bash mysql -u dbuser -pdbpassword << EOF use dbname; UPDATE s_products t SET t.buyable = (SELECT count(p.product_id) as cnt FROM (select distinct s.product_id, s.order_id from s_purchases s) p, s_orders o WHERE p.order_id=o.id AND o.status=2 AND p.product_id = t.id GROUP BY p.product_id); EOF Попутно добавил новое поле buyable в таблицу s_products и создал на него индекс Скрипт засунул в cron на запуск каждые 3 часа - я думаю такой периодичности достаточно для обновления популярности товара. У кого продажи идут каждые 5 минут могут сделать почаще! Далее правим api/Products.php, в функции get_products ищем запрос в переменной $query и добавляем в SELECT наше поле p.buyableЧуть выше, в область switch ($filter['sort']) добавляем: case 'buyable': // сортировка по покупаемости $order = 'p.buyable DESC'; break; В шаблоне, где у вас варианты сортировки, добавляем: <a {if $sort=='buyable'} class="selected bold"{/if} href="{url sort=buyable page=null}">популярности</a> Вроде все, теперь пользователи могут видеть, что покупается чаще всего! Прошу перенести в Готовые решения Цитата Ссылка на сообщение Поделиться на другие сайты
Gloobus Опубликовано 20 марта, 2014 Автор Жалоба Поделиться Опубликовано 20 марта, 2014 korsО, спасибо! Это правда более правильное решение. Единственное, нужно учесть то, что в одном заказе может быть два варианта одного и того же товара, когда будешь перебирать покупки из заказа. По хорошему, там же в Orders.php можно накалякать новую функцию, которая будет возвращаться только product_id из заказа, без учета вариантов, перебирать их и делать апдейт того же buyable.В любом случае, мой код пригодится для единовременно заполнения таблицы данными в buyable А когда наступает эти события, вызывающие close или open? Я предполагаю, что close наступает при статусе Выполнен или Удален. Но что будет, если мы выполненный заказ удалим? Получается, он будет играть роль в популярности товара, хотя и не должен! Но и удалять выполненный заказ тоже не правильно. И в моем варианте есть некий нюанс - если захотим почистить таблицу заказов, удалить старые, то после перерасчета, популярность поменяется. Цитата Ссылка на сообщение Поделиться на другие сайты
granata005 Опубликовано 8 мая, 2014 Жалоба Поделиться Опубликовано 8 мая, 2014 Программисты? )К чему проверять каждые 5 минут )опытному магазину (не открывшемуся неделю назад) достаточно делать сканирование заказов раз в неделю. Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 1 января, 2018 Жалоба Поделиться Опубликовано 1 января, 2018 При сортировке по покупаемости если в заказах например было всего 10 товаров (грубо говоря, по всем заказам в разделе выполненные) эти 10 товаров встают начала списка в категории, а после товары выстраиваются либо по id либо по created - не понятно. Причем первыми показываются самые старые товары. Подскажите пожалуйста как сделать напорот, чтобы после покупаемых товаров, товары были отсортированы например по id по убыванию, т.е. чтобы новые товары стояли впереди. Цитата Ссылка на сообщение Поделиться на другие сайты
misterY Опубликовано 1 января, 2018 Жалоба Поделиться Опубликовано 1 января, 2018 Менять примерно так: case 'buyable': // сортировка по покупаемости $order = 'p.buyable DESC, p.id DESC'; break; Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 1 января, 2018 Жалоба Поделиться Опубликовано 1 января, 2018 Супер, получилось! С Новым Годом! Спасибо! Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 15 января, 2020 Жалоба Поделиться Опубликовано 15 января, 2020 Добрый день!Подскажите а как можно чтобы учитывались не все заказы, а только за последний месяц?Я так понимаю необходимо написать что-то вроде AND o.date= DATE - 30 DAY но это не работает. Подскажите пожалуйста. Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 15 января, 2020 Жалоба Поделиться Опубликовано 15 января, 2020 Примерно так:AND o.date >= ( CURDATE() - INTERVAL 30 DAY ) Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 15 января, 2020 Жалоба Поделиться Опубликовано 15 января, 2020 Примерно так:AND o.date >= ( CURDATE() - INTERVAL 30 DAY ) Это я тоже пробовал - не срабатывает. Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 15 января, 2020 Жалоба Поделиться Опубликовано 15 января, 2020 У меня прекрасно работает. Скорее всего, у Вас в другом месте ошибка... Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 15 января, 2020 Жалоба Поделиться Опубликовано 15 января, 2020 Все разобрался, спасибо Вам большое (в тестовой базе делал, в ней не было заказов за 30 дней, чтобы сортировать)! Цитата Ссылка на сообщение Поделиться на другие сайты
byrzyi Опубликовано 31 октября, 2020 Жалоба Поделиться Опубликовано 31 октября, 2020 Пытаюсь через cron впихнуть запрос в БД php-файлом, прошу помощи, что не так: <?php $link = mysqli_connect("адресБД", "логин", "пароль", "имяБД"); $sql = "UPDATE s_products t SET t.buyable = (SELECT count(p.product_id) as cnt FROM (select distinct s.product_id, s.order_id from s_purchases s) p, s_orders o WHERE p.order_id=o.id AND o.status=2 AND p.product_id = t.id GROUP BY p.product_id)"; mysqli_close($link); ?> Суппорт говорит неверно пишу запрос в пхп Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.