Jump to content
Sign in to follow this  
ImLucky

JOIN-ы в SQL запросе

Recommended Posts

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

Есть стандартный запрос в 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

 

Что не так?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Just now, chukcha said:

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

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

Share this post


Link to post
Share on other sites

p2c.category_id

  • +1 1

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
2 minutes ago, chukcha said:

p2c.category_id

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites
12 minutes ago, chukcha said:

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

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

 

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

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

P.S.

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

Edited by ImLucky

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
5 часов назад, ImLucky сказал:

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.