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

mario512    3

Добрый день. Работаю над обработкой 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. Если убрать левые соединения, то все гуд. Где я накосячил? Задача выбрать айди товара, модель, ску, стоимость, остатки, и в какой отображается категории. 

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

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


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

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

GROUP BY oc_product.product_id

 

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


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

Прям волшебство. Спасибо. 

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


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

Или вот так, дублировалось в таблице 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'

 

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


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

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

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


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

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

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


Ссылка на сообщение
Поделиться на другие сайты
chukcha    1 084
6 минут назад, php сказал:

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


GROUP BY oc_product.product_id

 

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

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


Ссылка на сообщение
Поделиться на другие сайты
php    3
Только что, mario512 сказал:

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
Eldaeron    92
10 минут назад, chukcha сказал:

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

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

 

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

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


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

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

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


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

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

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


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

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

 

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

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
chukcha    1 084
2 минуты назад, mario512 сказал:

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

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

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


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

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

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

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


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

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

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

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

ИМХО.

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


Ссылка на сообщение
Поделиться на другие сайты
mario512    3
2 минуты назад, hoolygan сказал:

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

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

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

ИМХО.

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

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


Ссылка на сообщение
Поделиться на другие сайты
chukcha    1 084
55 минут назад, Eldaeron сказал:

AND pc.main_category = '1'

Уберите

 

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

 

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

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
hoolygan    84
3 минуты назад, chukcha сказал:

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

Точно.

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

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


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

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

 

scr.jpg

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


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

Все верно, там где NULL  товар не привязан к категории

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


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

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

 

scr2.jpg

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


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

откуда я знаю какой вы запрос мне показываете?

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


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

Вот:

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

 

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


Ссылка на сообщение
Поделиться на другие сайты
hoolygan    84
27 минут назад, mario512 сказал:

cd.category_id = pc.product_id

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

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


Ссылка на сообщение
Поделиться на другие сайты
chukcha    1 084
35 минут назад, mario512 сказал:

cd.category_id = pc.product_id

КАК!!!!

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


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

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

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

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

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

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

Войти

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

Войти


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

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