【问题标题】:MySQL - JOIN based on value of column?MySQL - 基于列的值加入?
【发布时间】:2017-03-22 14:46:54
【问题描述】:

我有两张桌子:

Table "categories"

category  |  parents
1         |  5,4,1
2         |  3,2

父列是用逗号分隔的一组数字,因此可以在查询中使用IN(parents)

Table "categories_goods"

item | category
10   | 1
12   | 2

我想将数据导出到第三张表 - 每个类别都有所有父母。结果应该是:

Table "categories_goods_all"

item | category
10   | 5
10   | 4
10   | 1
12   | 3
12   | 2

我已经在 PHP 中解决了这个问题,但是当表 categories_goods 中有 10000 * x 行时速度很慢。所以我正在寻找纯 MySQL 解决方案。有什么想法吗?

【问题讨论】:

    标签: mysql join subquery


    【解决方案1】:

    使用这个

    演示: http://rextester.com/CAF76544

    查询

    select
      g.item,
      SUBSTRING_INDEX(SUBSTRING_INDEX(c.parents, ',', numbers.n), ',', -1) category1
    from
      (select 1 n union all
       select 2 union all select 3 union all
       select 4 union all select 5) numbers 
     INNER JOIN categories c 
      on CHAR_LENGTH(c.parents)
         -CHAR_LENGTH(REPLACE(c.parents, ',', ''))>=numbers.n-1
      inner join categories_goods g
      on c.category=g.category 
    order by
      c.category, n
    

    感谢answer 将 csv 拆分为行。

    解释:number 表生成编号1-5。如果需要更多 parent,您可能希望在此处添加更多行。在它的帮助下,您可以将 csv 分隔到列中。请参阅上面给出的答案网址。

    现在您只需加入categories_goods 即可获取item 对应于parent

    【讨论】:

    • 谢谢,效果很好!! :) 有没有办法让它解析任意数量的值?现在它可以与 5 一起使用。我可以手动添加 select 6 union all ... 但它会以某种方式无限吗?
    猜你喜欢
    • 2010-12-08
    • 2010-12-11
    • 1970-01-01
    • 2021-11-07
    • 2018-01-24
    • 2017-08-28
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    相关资源
    最近更新 更多