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

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

 

Что не так?

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


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:

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

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

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


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

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

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

 

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

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 користувачів

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

×
×
  • Створити...

Important Information

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