Jump to content

Recommended Posts

Может быть делал кто нибудь сортировку по популярности?

Представляю ее как список товаров от самых покупаемых к менее покупаемым на основе заказов с типом "Выполнены" или "Новые", исключая "Удаленные"

 

Самому сделать не проблема, я просто думал может если кто делал и не жалко, поделится запросиком, мне больше не надо :)

Link to post
Share on other sites

Ответов не было, неужели никто не делал?

 

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

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>

Вроде все, теперь пользователи могут видеть, что покупается чаще всего!

 

Прошу перенести в Готовые решения

Link to post
Share on other sites

kors

О, спасибо! Это правда более правильное решение. Единственное, нужно учесть то, что в одном заказе может быть два варианта одного и того же товара, когда будешь перебирать покупки из заказа. По хорошему, там же в Orders.php можно накалякать новую функцию, которая будет возвращаться только product_id из заказа, без учета вариантов, перебирать их и делать апдейт того же buyable.

В любом случае, мой код пригодится для единовременно заполнения таблицы данными в buyable

 

А когда наступает эти события, вызывающие close или open? Я предполагаю, что close наступает при статусе Выполнен или Удален. Но что будет, если мы выполненный заказ удалим? Получается, он будет играть роль в популярности товара, хотя и не должен! Но и удалять выполненный заказ тоже не правильно. 

И в моем варианте есть некий нюанс - если захотим почистить таблицу заказов, удалить старые, то после перерасчета, популярность поменяется.

Link to post
Share on other sites
  • 1 month later...

Программисты? )

К чему проверять каждые 5 минут )

опытному магазину (не открывшемуся неделю назад) достаточно делать сканирование заказов раз в неделю.

Link to post
Share on other sites
  • 3 years later...

При сортировке по покупаемости если в заказах например было всего 10 товаров (грубо говоря, по всем заказам в разделе выполненные) эти 10 товаров встают начала списка в категории, а после товары выстраиваются либо по id либо по created - не понятно. Причем первыми показываются самые старые товары. Подскажите пожалуйста как сделать напорот, чтобы после покупаемых товаров, товары были отсортированы например по id по убыванию, т.е. чтобы новые товары стояли впереди.

Link to post
Share on other sites
  • 2 years later...

Добрый день!

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

Я так понимаю необходимо написать что-то вроде 

AND o.date= DATE - 30 DAY

 

но это не работает. Подскажите пожалуйста.

Link to post
Share on other sites
  • 9 months later...

Пытаюсь через 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);
?>

Суппорт говорит неверно пишу запрос в пхп

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...