mysql left join with find\ in\ u set无法正常工作?

kknvjkwl  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(239)

我已经使用left join编写了查询,它连接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_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

每个产品都有多个主类别,这些主类别存储了“产品”表中“主类别id”列的多个主类别id,如上面的“产品”表所示。
我这里的问题是,我的查询返回一个主类别名称,即使是对于没有任何“主类别标识”的产品,也就是说,即使没有分配任何主类别标识,产品也显示主类别名称,并且只有两个主类别的产品显示两个以上的类别。
有谁能帮我查一下有什么问题吗。谢谢。

uqxowvwt

uqxowvwt1#

您需要在“产品id”列上按分组。如果多个产品共享同一个名称,则可能会对这些数据进行分组,并给出不正确的结果。此外,在\集中查找\应与>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

相关问题