Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

Recommended Posts

Добрый день. Работаю над обработкой 1с для синхронизации данных с сайтом. Необходимо получить список товара с категориями. Вот сам запрос:

SELECT
    oc_product.product_id,
    sku,
    model,
    CAST(`price` AS CHAR),
    oc_category_description.name,
    quantity
FROM
    oc_product
LEFT JOIN oc_product_to_category ON oc_product_to_category.product_id = oc_product.product_id
LEFT JOIN oc_category_description ON oc_category_description.category_id = oc_product_to_category.product_id
WHERE
    oc_category_description.language_id = 1

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

Я так понял что дубли из-за двух языков в описаниях категорий. Если убрать условие: oc_category_description.language_id = 1 то одна строка выводится четыре раза. Куда копать? 

 

P.S. Сейчас обратил внимание, что мой запрос изначально выбирает только 24 ед. товара когда в базе их 41. Если убрать левые соединения, то все гуд. Где я накосячил? Задача выбрать айди товара, модель, ску, стоимость, остатки, и в какой отображается категории. 

Edited by mario512
Link to post
Share on other sites

В конец запроса, добавьте

GROUP BY oc_product.product_id

 

  • +1 2
Link to post
Share on other sites

Или вот так, дублировалось в таблице product_to_category

 

SELECT
    oc_product.product_id,
    sku,
    model,
    CAST(`price` AS CHAR),
    oc_category_description.name,
    quantity
FROM
    oc_product
LEFT JOIN oc_product_to_category ON oc_product_to_category.product_id = oc_product.product_id
LEFT JOIN oc_category_description ON oc_category_description.category_id = oc_product_to_category.product_id
WHERE
    oc_category_description.language_id = '1' AND oc_product_to_category.main_category = '1'

Или так

 

SELECT
    p.product_id,
    sku,
    model,
    CAST(`price` AS CHAR),
    cd.name,
    quantity
FROM
    oc_product AS p
LEFT JOIN oc_product_to_category AS pc ON pc.product_id = p.product_id
LEFT JOIN oc_category_description AS cd ON cd.category_id = pc.product_id
WHERE
    cd.language_id = '1' AND pc.main_category = '1'

 

Link to post
Share on other sites
6 минут назад, php сказал:

В конец запроса, добавьте


GROUP BY oc_product.product_id

 

ЗАЧЕМ!!!
Это даже не костыль, а затычка..

Link to post
Share on other sites
Только что, mario512 сказал:

а что за штука?

Группировка выборки

Link to post
Share on other sites

10 минут назад, chukcha сказал:

Это значит, что товар в двух катгориях

Да, верно. Может быть и в 3 и в 4 и больше...

 

@chukcha так как же нужно тогда?

Link to post
Share on other sites

По категориям тогда группировать но будут не по одному товару

Link to post
Share on other sites

Сейчас обратил внимание, что мой запрос изначально выбирает только 24 ед. товара когда в базе их 41. Если убрать левые соединения, то все гуд. Где я накосячил? Задача выбрать айди товара, модель, ску, стоимость, остатки, и какой принадлежит категории. 

Link to post
Share on other sites

Нужно привести к нормальному виду
У вас две категории привязаны к одному товару как главные

 

29 минут назад, chukcha сказал:

Это значит, что товар в двух катгориях

Это я неверно сказал

Link to post
Share on other sites
2 минуты назад, mario512 сказал:

изначально выбирает только 24 ед. товара когда в базе их 41.

Значит не у всех товаров есть главная категория

Link to post
Share on other sites
9 минут назад, chukcha сказал:

Значит не у всех товаров есть главная категория

Перефразирую. Нужна не главная категория, а та в которой он показывается. В какой таблице эти данные?

Link to post
Share on other sites

Джойны афигенно тяжелые конструкции для сиквела.

На кой джойнить целую таблицу, если ни одно поле из неё в конечном итоге не понадобится? Для таких целей используйте where exists ().

А иначе при больших базах начнете ловить тормоза.

ИМХО.

Link to post
Share on other sites

2 минуты назад, hoolygan сказал:

Джойны афигенно тяжелые конструкции для сиквела.

На кой джойнить целую таблицу, если ни одно поле из неё в конечном итоге не понадобится? Для таких целей используйте where exists ().

А иначе при больших базах начнете ловить тормоза.

ИМХО.

С чем это едят? Как их тут применить? 

Link to post
Share on other sites
55 минут назад, Eldaeron сказал:

AND pc.main_category = '1'

Уберите

 

Получите все категории

 

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

На кой джойнить целую таблицу, если ни одно поле из неё в конечном итоге не понадобится?

Как это ? а cd.name?

Link to post
Share on other sites
3 минуты назад, chukcha сказал:

Как это ? а cd.name?

Точно.

Не увидел. Что-то перепил. Беру слова назад.

Link to post
Share on other sites

@chukcha Не работает. Только 24 поз.  Если убрать условия, и добавить сортировку  которую предложил php то выводит все товары, но название категорий у некоторых NULL

 

scr.jpg

Link to post
Share on other sites

Да вроде привязан. Вот для 9 строка с низу на скрине, который я прикрепил к предыдущему сообщению (sku 438)

 

scr2.jpg

Link to post
Share on other sites

Вот:

SELECT
    p.product_id,
    sku,
    model,
    CAST(`price` AS CHAR),
    cd.name,
    quantity
FROM
    oc_product AS p
LEFT JOIN oc_product_to_category AS pc
ON
    pc.product_id = p.product_id
LEFT JOIN oc_category_description AS cd
ON
    cd.category_id = pc.product_id
GROUP BY
    p.product_id

 

Link to post
Share on other sites
27 минут назад, mario512 сказал:

cd.category_id = pc.product_id

Крутттто, что можно сказать :D

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
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

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.