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

Изменить запрос в getProducts


Recommended Posts

Подскажите как правильно изменить запрос к БД добавив одно условие
Есть вот что:
 

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";

Нужно добавить условие, отбирать те ID у которых isbn = 1
Проверил такой запрос напрямую в mysql, он дает нужный мне результат:

SELECT product_id FROM oc_product WHERE isbn = '1'

Пробовал заменить строчку существующего кода на свой: 
SELECT p.product_id,  заменил на SELECT product_id FROM " . DB_PREFIX . "product WHERE isbn = '1',

Еще вот так подставлял. Общем разные варианты пробовал.....

"SELECT p.product_id FROM " . DB_PREFIX . "product p WHERE isbn = '1',

 

И у меня ничего хорошего с этого не вышло. Понимаю что знаний не хватает, прошу помощи.

 

 

Змінено користувачем Seofisher
Надіслати
Поділитися на інших сайтах

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

p.isbn = '1'

и, судя по всему, кусок кода не докопипастили
там, где что-то типа:

FROM " . DB_PREFIX . "product p"

Змінено користувачем ElSch
Надіслати
Поділитися на інших сайтах


9 минут назад, nikifalex сказал:

вы в курсе что ISBN это Международный стандартный книжный номер. Зачем вы туда пишете единицу?

Ну возможно это просто для теста "1"

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


Я думал вам дописать условие но прочитал ваш запрос у вас он не полный нет select к product чтобы получтьб полный код запроса вставте переменую $sql в var_dump

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

38 минут назад, AlexDW сказал:

AS special WHERE isbn = '1' ";

Спасибо! Но наверное этого мало, к сожалению. Получаю ошибку.

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

вы в курсе что ISBN это Международный стандартный книжный номер. Зачем вы туда пишете единицу?

Использую это поле в своих целях.
 

7 минут назад, konorws сказал:

Я думал вам дописать условие но прочитал ваш запрос у вас он не полный нет select к product чтобы получтьб полный код запроса вставте переменую $sql в var_dump

Да, я часть только взял. Думал ключевое находится именно там...

Скрытый текст

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";

        if (!empty($data['filter_category_id'])) {
            if (!empty($data['filter_sub_category'])) {
                $sql .= " FROM " . DB_PREFIX . "category_path cp LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (cp.category_id = p2c.category_id)";
            } else {
                $sql .= " FROM " . DB_PREFIX . "product_to_category p2c";
            }

            if (!empty($data['filter_filter'])) {
                $sql .= " LEFT JOIN " . DB_PREFIX . "product_filter pf ON (p2c.product_id = pf.product_id) LEFT JOIN " . DB_PREFIX . "product p ON (pf.product_id = p.product_id)";
            } else {
                $sql .= " LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id)";
            }
        } else {
            $sql .= " FROM " . DB_PREFIX . "product p";
        }

        $sql .= " LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'";

        if (!empty($data['filter_category_id'])) {
            if (!empty($data['filter_sub_category'])) {
                $sql .= " AND cp.path_id = '" . (int)$data['filter_category_id'] . "'";
            } else {
                $sql .= " AND p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
            }

            if (!empty($data['filter_filter'])) {
                $implode = array();

                $filters = explode(',', $data['filter_filter']);

                foreach ($filters as $filter_id) {
                    $implode[] = (int)$filter_id;
                }

                $sql .= " AND pf.filter_id IN (" . implode(',', $implode) . ")";
            }
        }

        if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {
            $sql .= " AND (";

            if (!empty($data['filter_name'])) {
                $implode = array();

                $words = explode(' ', trim(preg_replace('/\s+/', ' ', $data['filter_name'])));

                foreach ($words as $word) {
                    $implode[] = "pd.name LIKE '%" . $this->db->escape($word) . "%'";
                }

                if ($implode) {
                    $sql .= " " . implode(" AND ", $implode) . "";
                }

                if (!empty($data['filter_description'])) {
                    $sql .= " OR pd.description LIKE '%" . $this->db->escape($data['filter_name']) . "%'";
                }
            }

            if (!empty($data['filter_name']) && !empty($data['filter_tag'])) {
                $sql .= " OR ";
            }

            if (!empty($data['filter_tag'])) {
                $sql .= "pd.tag LIKE '%" . $this->db->escape($data['filter_tag']) . "%'";
            }

            if (!empty($data['filter_name'])) {
                $sql .= " OR LCASE(p.model) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                $sql .= " OR LCASE(p.sku) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                $sql .= " OR LCASE(p.upc) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                $sql .= " OR LCASE(p.ean) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                $sql .= " OR LCASE(p.jan) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                $sql .= " OR LCASE(p.isbn) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
                $sql .= " OR LCASE(p.mpn) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
            }

            $sql .= ")";
        }

        if (!empty($data['filter_manufacturer_id'])) {
            $sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";
        }

        $sql .= " GROUP BY p.product_id";

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

        if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
            if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
                $sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
            } elseif ($data['sort'] == 'p.price') {
                $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
            } else {
                $sql .= " ORDER BY " . $data['sort'];
            }
        } else {
            $sql .= " ORDER BY p.sort_order";
        }

        if (isset($data['order']) && ($data['order'] == 'DESC')) {
            $sql .= " DESC, LCASE(pd.name) DESC";
        } else {
            $sql .= " ASC, LCASE(pd.name) ASC";
        }

        if (isset($data['start']) || isset($data['limit'])) {
            if ($data['start'] < 0) {
                $data['start'] = 0;
            }

            if ($data['limit'] < 1) {
                $data['limit'] = 20;
            }

            $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
        }

        $product_data = array();

        $query = $this->db->query($sql);

        foreach ($query->rows as $result) {
            $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
        }

        return $product_data;
    }

 

Змінено користувачем Seofisher
Надіслати
Поділитися на інших сайтах

Находите код

что то типа

if (!empty($data['filter_filter'])) {
                $sql .= " LEFT JOIN " . DB_PREFIX . "product_filter pf ON (p2c.product_id = pf.product_id) LEFT JOIN " . DB_PREFIX . "product p ON (pf.product_id = p.product_id)";
            } else {
                $sql .= " LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id)";
            }
        } else {
            $sql .= " FROM " . DB_PREFIX . "product p";
        }

 

дописываете в каждой строчке для  sql

 WHERE p.isbn='1'

либо в низу под этим кодом

$sql.="  WHERE p.ibsn='1' ";

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


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

дописываете в каждой строчке для  sql

к чему такие сложности?

достаточно добавить

$sql.="  AND p.isbn='1' ";

перед строкой

 $sql .= " GROUP BY p.product_id";

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

Я так понимаю что задействован фильтр, но все товары задействованы до фильтрации...?
Дело вот в чем. Отображается на странице 8 товаров (у которых isbn=1), но внизу присутствует пагинация и количество товаров:

Показано с 1 по 40 из 84 (всего 3 страниц) 

 

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

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

Для пагинации надо еще  менять запрос в getTotalProducts

Еще раз благодарю!

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

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

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

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

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

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

Вхід

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

Вхід зараз
×
×
  • Створити...

Important Information

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