【问题标题】:MySql Left join with find_in_set not working properly?MySql Left join with find_in_set 不能正常工作?
【发布时间】:2018-06-28 04:47:29
【问题描述】:

我已经编写了使用左连接的查询,它连接 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 id 存储在 'products' 表中的 'master_category_id' 列中,如上面的 'products' 表所示。

我的问题是我的查询返回一个 master_category_name 即使对于没有任何“master_category_id”的产品,即产品显示一个 master_category_name 即使它没有分配任何 master_category_id 并且产品也有只有 2 个 master_categories 显示超过 2 个类别

谁能帮我我的查询出了什么问题。谢谢。

【问题讨论】:

  • find_in_set(mc.master_category_id,p.master_category_id) 更改为find_in_set(mc.master_category_id,p.master_category_id) > 0
  • 我试过了,结果还是一样,不行。

标签: mysql join left-join


【解决方案1】:

您需要对 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

【讨论】:

  • 感谢您的回复,问题似乎已解决,我将再次测试并回复您。我也想知道你的经验,如果你不介意你能告诉我你在开发方面有多少经验吗? @skelwa
  • 干杯。标记为正确答案,如果您不想透露您的经验,那没关系,但再次感谢您的回复。
猜你喜欢
  • 2023-03-17
  • 2021-01-07
  • 2013-11-02
  • 1970-01-01
  • 2017-04-25
  • 2018-02-21
  • 2015-06-29
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多