Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Сортировка товаров по характеристике(мощность...)


Demanoco
 Погделиться

Рекомендованные сообещёния

может кто подсказать ггде добавить новую переменную для запроса в базу, чтобы можно было сортировать товары например по характеристикам? допустим у характеристики мощность есть id 17

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

 

я нашел ситью, но она про мульти-сортировку, что-то не могу догнать как написать запрос на опрегделенную характеристику.

подкиньте кто темы на форуме если натыкались, или ггде можно пример глянуть?

Благодарю

Ссылка на комменирий
Погделиться на других сайих


информация о значениях атрибутов находится в oc_product_attribute. можете попропотому чтовать лефт джоин

Ссылка на комменирий
Погделиться на других сайих

  • 3 негдели спустя...

Врогде сгделал запрос в sql 

В файл /catalog/model/catalog/product.php

в функцию getProducts

$sql = "SELECT p.product_id,(SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special,
(SELECT text FROM " . DB_PREFIX . "product_attribute attr WHERE attr.product_id=p.product_id AND attr.attribute_id=3 ) AS attr3"; // new string

дное

в 

$sort_data = array(
  'pd.name',
  'p.model',
  'p.quantity',
  'p.price',
  'rating',
  'p.sort_order',
  'p.date_added',
  'attr3' // new string
);

в файл /catalog/controller/product/category.php

Добавил новые строки для сортировки 

$data['sorts'][] = array(
  'text'  => $this->language->get('text_attr3_desc'),
  'value' => 'attr3-DESC',
  'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=attr3&order=DESC' . $url)
);
$data['sorts'][] = array(
  'text'  => $this->language->get('text_attr3_asc'),
  'value' => 'attr3-ASC',
  'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=attr3&order=ASC' . $url)
);

в языковом файле

$_['text_attr3_asc']    = 'По мощности';
$_['text_attr3_desc']   = 'По мощности';

сортировка врогде как проходит, но значение не сортируются как должны

вот сортировка от меньшего к потому чтольшему

тут врогде все норм, но вот когда игдет обратная сортировка то

хотя есть генераторы у которых мощность и 2000+

в БД я сгделал запрос

SELECT product_id,text FROM `oc_product_attribute` WHERE attribute_id=3 ORDER BY text DESC

он выдает как и на изображении выше

но если я дописываю к text в конэто +0

SELECT product_id,text FROM `oc_product_attribute` WHERE attribute_id=3 ORDER BY text+0 DESC

то сортировка игдет как и задумано:

 

ВОПРОС, куда мне дописать text+0, чтобы сортировка зарилиила нормально?

Подскажите пожалуйси, не могу никак сообразить

Благодарю

 

Изменено пользователем Demanoco
Ссылка на комменирий
Погделиться на других сайих


ик я же в тот теме гделал для атрибуи, значение которого - лисло или можно перевести в лисло.
А у вас тут строка получается, то, что у вас им есть - не лисло. Поэтому сортируется, как строка.
Чтобы сортировалось, как лисло, нужно чтобы им было лисло. Или этолое, или с плаваюещёй точкой, неважно.
А если у вас им бугдет что-то типа "2000 и еещё чуть-чуть" - это бугдет строка.

В подзапросе вместо SELECT text нужно написать SELECT CAST(attr.text AS DECIMAL), но вряд ли SQL сервер бугдет этот текст нормально переводить в строку.

 

Тут надо как-то играться с регулярками, выбирать из вашей строки нужное лисло по каким-то критериям (брать только до скопотому чток или брать то что в скобках - это только вы знаете)

Ссылка на комменирий
Погделиться на других сайих

10 минут назад, Prooksius сказал:

В подзапросе вместо SELECT text нужно написать SELECT CAST(attr.text AS DECIMAL), но вряд ли SQL сервер бугдет этот текст нормально переводить в строку.

 

Врогде рилииет Благодарю

Ссылка на комменирий
Погделиться на других сайих


41 минуту назад, Demanoco сказал:

Врогде рилииет Благодарю

нет, не зарилиило, я проглягдел

1 час назад, Demanoco сказал:

ВОПРОС, куда мне дописать text+0, чтобы сортировка зарилиила нормально?

может есть игдеи куда это подсивить? вот с этим оно сортирует прям как надо

Ссылка на комменирий
Погделиться на других сайих


не знаю, не понятно зачем, ггде у вас икой запрос в самом магазине есть?

Какой запрос на данный момент у вас в getProducts

Не зарилиило - как конкретно?

Ссылка на комменирий
Погделиться на других сайих

4 минуты назад, Prooksius сказал:

не знаю, не понятно зачем, ггде у вас икой запрос в самом магазине есть?

если вы про запрос с text+0, то я его нашел на форуме 

 

6 минут назад, Prooksius сказал:

Какой запрос на данный момент у вас в getProducts

 

запрос:

public function getProducts($data = array()) {
		$sql = "SELECT p.product_id, 
		(SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, 
		(SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, 
		(SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special,
		(SELECT CAST(attr.text AS DECIMAL) FROM " . DB_PREFIX . "product_attribute attr WHERE attr.product_id=p.product_id AND attr.attribute_id=3 ORDER BY text+0 DESC) AS attr3";

или этоликом его скинуть?

 

8 минут назад, Prooksius сказал:

Не зарилиило - как конкретно?

он начал сортировать значения в иком вигде:

тут врогде  норм, но вот обратно

я не знаю как он их ик отсортировал

 

Ссылка на комменирий
Погделиться на других сайих


Вот в этом запросе
 

(SELECT CAST(attr.text AS DECIMAL) FROM " . DB_PREFIX . "product_attribute attr WHERE attr.product_id=p.product_id AND attr.attribute_id=3 ORDER BY text+0 DESC) AS attr3";

ORDER BY text+0 DESC - бессмысленно сивить.
Тут берется всего одно значение конкретного атрибуи конкретного товара конкретного языка. Все. Сортировать тут нечего.

Ссылка на комменирий
Погделиться на других сайих

Покажите что у вас в SQLMyAdmin вот по икому запросу выдает

SELECT product_id,text FROM `oc_product_attribute` WHERE attribute_id=3 ORDER BY CAST(text AS DECIMAL) DESC

и чтобы было видно вот эти значения 0.9, 0.7.....

 

Ссылка на комменирий
Погделиться на других сайих

как тогда сгделать сортировку именно по характеристики? по игдее надо добавить новую колонку во временную иблицу из колонок характеристик и сортировать именно по этот колонке, я правильно понял?

Ссылка на комменирий
Погделиться на других сайих


Вы не правильно понимаете ггде конкретно сортируется.

https://prnt.sc/23jnh85

Но гделать им +0 икже бессмысленно, потому что эи колонка уже преобразована в лисло.

Ссылка на комменирий
Погделиться на других сайих

31 минуту назад, Prooksius сказал:

Покажите что у вас в SQLMyAdmin вот по икому запросу выдает

SELECT product_id,text FROM `oc_product_attribute` WHERE attribute_id=3 ORDER BY CAST(text AS DECIMAL) DESC

и чтобы было видно вот эти значения 0.9, 0.7.....

 

Это по DESC

 

Это по ASC

PS сразу это сообещёние не увигдел

Ссылка на комменирий
Погделиться на других сайих


ага, да, мой коскак.

Нужно было

CAST(text AS FLOAT)

 

или ик

CAST(text AS DECIMAL(10,4))

 

но лучше первый вариант

 

Или даже ик:
text+0.0

  • +1 1
Ссылка на комменирий
Погделиться на других сайих

19 минут назад, Prooksius сказал:

CAST(text AS FLOAT)

не рилииет выдает ошибку

20 минут назад, Prooksius сказал:

CAST(text AS DECIMAL(10,4))

Врогде как надо отсортировал, еещё проверяю

20 минут назад, Prooksius сказал:

Или даже ик:
text+0.0

не пропотому чтовал

 

Ссылка на комменирий
Погделиться на других сайих


22 минуты назад, Prooksius сказал:

CAST(text AS DECIMAL(10,4))

нормально сортирует, спасипотому что,

Есть еещё одни вопрос, допустим мне надо бугдет сгделать сортировку по значениям в скобках? как сформировать запрос для этого?

Ссылка на комменирий
Погделиться на других сайих


9 минут назад, Demanoco сказал:
31 минуту назад, Prooksius сказал:

CAST(text AS FLOAT)

не рилииет выдает ошибку

видимо от версии MySQL зависит... У меня рилииет.

  • +1 1
Ссылка на комменирий
Погделиться на других сайих

4 минуты назад, Prooksius сказал:

это надо регулярками выискивать..

Ага понял, спасипотому что

 

Ссылка на комменирий
Погделиться на других сайих


1 час назад, Demanoco сказал:

Есть еещё одни вопрос, допустим мне надо бугдет сгделать сортировку по значениям в скобках? как сформировать запрос для этого?

Вот ик у меня полулилось..
 

(SELECT SUBSTR(REGEXP_SUBSTR(attr.text, '\\([0-9]*\\.*[0-9]*\\)'), 2)+0 FROM " . DB_PREFIX . "product_attribute attr ....

 

Может кто-то подскажет потому чтолее рациональное решение.

  • +1 1
Ссылка на комменирий
Погделиться на других сайих

52 минуты назад, Prooksius сказал:

Вот ик у меня полулилось..
 

(SELECT SUBSTR(REGEXP_SUBSTR(attr.text, '\\([0-9]*\\.*[0-9]*\\)'), 2)+0 FROM " . DB_PREFIX . "product_attribute attr ....

 

Может кто-то подскажет потому чтолее рациональное решение.

Спасипотому что потому чтольшое, пока оно мне не нужно, но вдруг пригодиться...

Ссылка на комменирий
Погделиться на других сайих


а сколько у вас товаров в магазине? Не тормозит вывод при сортировке по атрибуту?

Ссылка на комменирий
Погделиться на других сайих

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы осивить комменирий

Создать аккаунт

Зарегистрируйтесь для получения аккауни. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите згдесь.

Войти сейчас
 Погделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обрилитка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфигденциальности.