MySql Оставлено соединение с find_in_set не работает должным образом? - PullRequest
0 голосов
/ 28 июня 2018

Я написал запрос, используя левое соединение, которое объединяет 3 таблицы для получения данных:

Продукты:

product_id  category_id  master_category_id  manufacturers_id  product_name  product_img  product_des  product_price  product_status
  17421      194           4,6,7,5               2504           prod_name    image-1.jpg   ----            ----              1

master_categories:

 master_category_id  master_category_name  original_image  picture  small  thumb  icon_img  master_category_status
    1               Dinnerware/Glassware   cat-image1.jpg     --      --      --     --             1

Производители:

manufacturers_id   manufacturers_name  original_image  picture  small  thumb  manufacturers_status
  1                    CalMil           Cal-Mil.png      --      --      --    1

Мой запрос:

select (Case When p.product_status  = '0' Then 'Inactive' 
             When p.product_status  = '1' Then 'Active' 
             Else 'Deleted' End) AS status,
m.manufacturers_name,
GROUP_CONCAT(mc.master_category_name) as master_category_name,
TRIM(p.product_name) as product_name,
p.product_status,p.product_id 
from products p 
left join manufacturers m 
on p.manufacturers_id=m.manufacturers_id 
left join master_categories mc 
on find_in_set(mc.master_category_id,p.master_category_id) 
where p.product_name!=''
GROUP BY p.product_name order by TRIM(p.product_name) ASC LIMIT 0,15

Каждый продукт имеет несколько master_categories, которые хранят свои несколько идентификаторов master_category для столбца «master_category_id» в таблице «products», как показано в таблице «products» выше.

Моя проблема здесь в том, что Мой запрос возвращает master_category_name даже для продукта, у которого нет master_category_id, т. Е. Product показывает master_category_name, даже если у него нет назначенного master_category_id, а также для продукта, который имеет только 2 master_categories, показывающие более 2 категорий .

Может кто-нибудь, пожалуйста, помогите мне Что не так в моем запросе. Спасибо.

1 Ответ

0 голосов
/ 28 июня 2018

Вам нужно сделать группировку по столбцу product_id. Если несколько продуктов имеют одно и то же имя, возможно, они группируют эти данные и дают неверный результат. Также find_in_set должен использоваться с условием> 0. Попробуйте это.

SELECT 
    (CASE
        WHEN p.product_status = '0' THEN 'Inactive'
        WHEN p.product_status = '1' THEN 'Active'
        ELSE 'Deleted'
    END) AS status,
    m.manufacturers_name,
    GROUP_CONCAT(mc.master_category_name) AS master_category_name,
    TRIM(p.product_name) AS product_name,
    p.product_status,
    p.product_id
FROM
    products p
        LEFT JOIN
    manufacturers m ON p.manufacturers_id = m.manufacturers_id
        LEFT JOIN
    master_categories mc ON FIND_IN_SET(mc.master_category_id,
            p.master_category_id) > 0
WHERE
    p.product_name != ''
GROUP BY p.product_id
ORDER BY TRIM(p.product_name) ASC
LIMIT 0 , 15
...