Перейти к содержанию

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

Помогите, пожалуйста. Голова не варит уже.

Есть стандартный запрос в catalog/model/product.php getProductSpecials

SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM oc_review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM oc_product_special ps LEFT JOIN oc_product p ON (ps.product_id = p.product_id)LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id ORDER BY p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,27

Мне нужно, чтобы выборка шла из определенной категории, то есть чтобы выводил не все товары со скидками, как по дефолту, а только из категории "421"

 

Меняю запрос так

 

SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM oc_review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM oc_product_special ps LEFT JOIN oc_product p ON (ps.product_id = p.product_id)LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) 
LEFT JOIN oc_product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p2c.category='421' LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id ORDER BY p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,27

Выдает ошибку 

Quote

 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.sta' at line 2

 

Что не так?

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


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

Where итоговое должно идти после всех joinов. у вас оно в середине запроса да еще и в кол-ве двух штук.
Должно быть так (если в самих джоинах нет ошибок):

SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM oc_review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM oc_product_special ps LEFT JOIN oc_product p ON (ps.product_id = p.product_id) LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) 
LEFT JOIN oc_product_to_category p2c ON (p.product_id = p2c.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p2c.category='421' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id ORDER BY p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,27

 

  • +1 1

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


Ссылка на сообщение
Поделиться на другие сайты
20 minutes ago, Raino said:

Where итоговое должно идти после всех joinов. у вас оно в середине запроса да еще и в кол-ве двух штук.
 

Ок, с этим понял, спасибо. Действительно затупил. Надо запомнить уже наконец.

 

Сейчас получается так

SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM oc_review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM oc_product_special ps LEFT JOIN oc_product p ON (ps.product_id = p.product_id) LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_category p2c ON (p.product_id = p2c.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p2c.category='421' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id ORDER BY p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,27

 

000001.jpg

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


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

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

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


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

Научитесь форматировать запросы

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


Ссылка на сообщение
Поделиться на другие сайты
Just now, chukcha said:

Научитесь форматировать запросы

Дайте направление и с удовольствием научусь. Что подразумевается под "форматированием"? 

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


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

p2c.category_id

  • +1 1

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


Ссылка на сообщение
Поделиться на другие сайты
SELECT DISTINCT ps.product_id, 
	(SELECT AVG(rating) FROM oc_review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating 
FROM oc_product_special ps 
	LEFT JOIN oc_product p ON (ps.product_id = p.product_id) 
	LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) 
	LEFT JOIN oc_product_to_category p2c ON (p.product_id = p2c.product_id) 
	LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) 
WHERE p2c.category='421' 
	AND p.status = '1' 
	AND p.date_available <= NOW() 
	AND p2s.store_id = '0' 
	AND ps.customer_group_id = '1' 
	AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) 
	AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) 
GROUP BY ps.product_id 
ORDER BY p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,27

 

  • +1 3

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


Ссылка на сообщение
Поделиться на другие сайты
2 minutes ago, chukcha said:

p2c.category_id

Понял, сейчас исправлю, спасибо за внимательность. 

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


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

Когда у вас, как и Даниеля, все в одну строку, то отладить визуально такой запрос практически не возможно.

Это же относится и к форматированию кода, не жалейте пробелов или табов

 

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


Ссылка на сообщение
Поделиться на другие сайты
12 minutes ago, chukcha said:

Когда у вас, как и Даниеля, все в одну строку, то отладить визуально такой запрос практически не возможно.

Это же относится и к форматированию кода, не жалейте пробелов или табов

 

Я просто через var_dump скопировал строку запроса. Обернул на форуме в code и выставил SQL в параметрах, надеялся, что понятно всё будет.

Но я вас понял, спасибо. 

P.S.

Понятия не имею кто такой "Даниель" :D 

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

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


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

А, ну и да, запрос вроде работает, без ошибок, но почему-то на странице index.php?route=product/special теперь появились товары без ID, с нулевой ценой и т.д., то есть просто "пустые", фейковые. И пагинация не работает. Что на 1-ой, что на 2-ой, что на 3-ей странице одни и те же товары. 

getTotalProductSpecials менял, но без результата. Постараюсь разобраться, но походу надо уже спать идти. По 30-40 часов работать без сна - такое себе.

В любом случае, спасибо любимое комьюнити)) Я вас люлю)) 

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


Ссылка на сообщение
Поделиться на другие сайты
5 часов назад, ImLucky сказал:

Понятия не имею кто такой "Даниель"

https://www.opencart.com/blog?blog_id=48

Создатель Opencart....

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


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

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

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

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

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

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

Войти

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

Войти

  • Последние посетители   0 пользователей онлайн

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

×

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

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