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

Запрос в MySQL


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

Змінено користувачем mario512
Надіслати
Поділитися на інших сайтах

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

 

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

6 минут назад, php сказал:

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


GROUP BY oc_product.product_id

 

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

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

Только что, mario512 сказал:

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

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

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


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

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

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

 

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

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

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

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


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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ИМХО.

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


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

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

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

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

ИМХО.

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

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

55 минут назад, Eldaeron сказал:

AND pc.main_category = '1'

Уберите

 

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

 

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

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

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

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

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

 

scr.jpg

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

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

 

scr2.jpg

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

Вот:

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

 

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

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

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

Important Information

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