Рекомендуемые сообщения

Seofisher    0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
AlexDW    823

AS special WHERE isbn = '1' ";

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ElSch    1

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

p.isbn = '1'

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

FROM " . DB_PREFIX . "product p"

Изменено пользователем ElSch

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
nikifalex    334

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
konorws    31
9 минут назад, nikifalex сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
konorws    31


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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Seofisher    0
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ElSch    1

Находите код

что то типа

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
AlexDW    823
8 минут назад, ElSch сказал:

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ElSch    1

там в низу написано, что можно

Цитата

 

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

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

 

 

Изменено пользователем ElSch

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ElSch    1

Хотя нет, скорее вру))

соглашусь с AlexDW

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Seofisher    0

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ElSch    1

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Seofisher    0
1 час назад, ElSch сказал:

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

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

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От DmitriySun
      ранее доставались только имеющиеся товары
      $products = $this->model_catalog_product->getProducts(array('start' => 0, 'available' => 1, 'limit' => 1000000));
      и выводились на екран 
      if ($product['quantity']) {
                              $output .= '<stock>' . $this->language->get('text_in_stock') . '</stock>';
                          } else {
                              $output .= '<stock>' . $this->language->get('text_out_of_stock') . '</stock>';
                          }
      я хочу изменить на то, чтобы доставать все товары и в зависимости от того нет ли есть выводить в прайс нужное мне сообщение. сделал так
      $products = $this->model_catalog_product->getProducts();
      вывожу так
      // if ($product ['status'] != 1 ) {
                  //            $output .= '<stock>' . $this->language->get('text_in_stock') . '</stock>';
                  //        } else {
                  //            $output .= '<stock days="10" >' . $this->language->get('text_out_of_stock') . '</stock>';
                  //        }
           
           if ($product ['stock_status'] !='Нет в наличии') {
                              $output .= '<stock>' . $this->language->get('text_in_stock') . '</stock>';
                          } else {
                              $output .= '<stock days="10" >' . $this->language->get('text_out_of_stock') . '</stock>';
                          }
      при обоих вариантах выдает ошибку
      This page contains the following errors:
      error on line 6209 at column 80109: StartTag: invalid element name Below is a rendering of the page up to the first error.
    • От DmitriySun
      ранее доставались только имеющиеся товары
      $products = $this->model_catalog_product->getProducts(array('start' => 0, 'available' => 1, 'limit' => 1000000));
      и выводились на екран 
      if ($product['quantity']) {
                              $output .= '<stock>' . $this->language->get('text_in_stock') . '</stock>';
                          } else {
                              $output .= '<stock>' . $this->language->get('text_out_of_stock') . '</stock>';
                          }
      я хочу изменить на то, чтобы доставать все товары и в зависимости от того нет ли есть выводить в прайс нужное мне сообщение. сделал так
      $products = $this->model_catalog_product->getProducts();
      вывожу так
      // if ($product ['status'] != 1 ) {
                  //            $output .= '<stock>' . $this->language->get('text_in_stock') . '</stock>';
                  //        } else {
                  //            $output .= '<stock days="10" >' . $this->language->get('text_out_of_stock') . '</stock>';
                  //        }
           
           if ($product ['stock_status'] !='Нет в наличии') {
                              $output .= '<stock>' . $this->language->get('text_in_stock') . '</stock>';
                          } else {
                              $output .= '<stock days="10" >' . $this->language->get('text_out_of_stock') . '</stock>';
                          }
      при обоих вариантах выдает ошибку
      This page contains the following errors:
      error on line 6209 at column 80109: StartTag: invalid element name Below is a rendering of the page up to the first error.
    • От fantom4uk
      хочу сделать чтоб товары Которые старше указанной даты не выводилы на сайте ,типа не показывало в категориях и поиску, 
      дана функция getProducts($data) находиться в каталоге\модуль\каталог\продукт, вот тут и проблема я не могу разобраться как мне сделать ,я в пхп новичок можете помочь
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу