Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Demanoco

Recommended Posts

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

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

 

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

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

Благодарю

Надіслати
Поділитися на інших сайтах


  • 3 weeks later...

Вроде сделал запрос в 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']   = 'По мощности';

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

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

image.thumb.png.0c0940aafef4b4ebf301339c009f5fb2.png

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

image.thumb.png.682f651d5230f4917dbcb5123f4ee5d4.png

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

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

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

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

image.thumb.png.ecf15f7b51f6670a680728163b2cb86c.png

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

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

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

image.thumb.png.6d4a3cbe427267fc4869e6eaa9657a29.png

 

ВОПРОС, куда мне дописать 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 сказал:

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

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

image.thumb.png.0afb3c16a1e027b5ff972abb6ca25c7b.png

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

image.thumb.png.172cde6156441bd90592d4d65346c7d2.png

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

 

Надіслати
Поділитися на інших сайтах


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

(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

image.thumb.png.8804fe5dc4dad0671a3f4f048297ec4a.png

 

Это по ASC

image.thumb.png.2dee34f5d2931c678478ba98dc957f8b.png

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

Надіслати
Поділитися на інших сайтах


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
Надіслати
Поділитися на інших сайтах

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 ....

 

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

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

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.