【问题标题】:Split values and loop through them拆分值并循环它们
【发布时间】:2020-02-20 07:33:57
【问题描述】:

我有两张桌子: 表1:

id | value
1  | val1
2  | val2
3  | val3

表2:

id | value
1  | val1,val2,val22
2  | val2
3  | val3,val15,

我想要做的事情是用逗号分割 Table2 中的值(以获取分隔值),然后循环遍历它并在 Table1 中找到它们。因此,我需要包含 Table1 中的值的 Table1.id 和 Table2.id 将它们插入到新表中。

由于没有SPLIT功能,mysql可以做到吗?

编辑:MySql 版本 5.7.27

Edit2:期望的结果:

table1.id  table1.valie  table1.id  table1.valie
        1          val1          1  val1,val2,val22
        2          val2          1  val1,val2,val22
        2          val2          2  val2
        3          val3          3  val3,val15,

【问题讨论】:

  • 因此我需要将其显示为表格。并指定您的 MySQL 版本。
  • 编辑:MySql 版本 5.7.27 table2.value 中逗号的最大数量是多少?
  • 是的,对不起,我忘了把它放在问题中。已编辑。
  • 我建议创建存储过程而不是单个查询 - 它会更简单。
  • 附言。而且我希望看到显示的源数据的所需结果 - 将其格式化为表格,如源,并指定它是否必须是某个源表、另一个表或简单输出记录集的内容。

标签: mysql sql loops


【解决方案1】:
CREATE TABLE table3
SELECT t1.id `t1.id`, t1.value `t1.value`, t2.id `t2.id`, t2.value `t2.value`
FROM table1 t1
JOIN table2 t2 ON FIND_IN_SET(t1.value, t2.value);

fiddle

【讨论】:

    【解决方案2】:

    MySql 版本 5.7.27

    使用(假设 table2.value 包含不超过 10 个单独的值)

    CREATE TABLE table3
    /* or INSERT INTO table3 (value) if this table already exists */
    SELECT *
    FROM ( SELECT value
           FROM table1 
         UNION
           SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(table2.value, ',', numbers.num), ',', -1)) value
           FROM table2,
                ( SELECT 1 num UNION 
                  SELECT 2 UNION 
                  SELECT 3 UNION 
                  SELECT 4 UNION 
                  SELECT 5 UNION 
                  SELECT 6 UNION
                  SELECT 7 UNION
                  SELECT 8 UNION
                  SELECT 9 UNION
                  SELECT 10 ) numbers
           WHERE numbers.num <= LENGTH(table2.value) - LENGTH(REPLACE(table2.value, ',', '')) + 1
           HAVING value != '') total;
    

    fiddle

    【讨论】:

    • 这个只选择值,我想用SELECT table1.id, table1.value, table2.id, table2.value来比较一下。
    • @demoo 我问过你 - 显示结果。作为表。你很懒——而我并不聪明。
    • 我想 SELECT table1.id, table1.value, table2.id, table2.value 来比较一下。 反对 我想做将它们插入另一个表。像这样: INSERT INTO match (id_table1, d_table2, comment, active, date_add, date_upd) ... - 请在实践中决定你想要什么。选择一种变体。
    • 是的,但我说 INSERT INTO match (id_table1, d_table2, comment, active, date_add, date_upd) 所以我明白我仍然需要两个表中的那些 id .顺便说一句谢谢!我认为没有程序是不可能做到的。
    • @demoo 可能。此外,我认为这很容易。
    【解决方案3】:

    也许这会对你有所帮助。

    PATINDEX() replacement in MYSQL

    通过索引值获取索引拆分行后。您的数据将如下所示

    Table2:
    id | value
    1  | val1
    1  | val2
    1  | valu22
    2  | val2
    3  | val3
    3  | val15
    

    然后你可以做类似的事情:

    select * from table2 where value in (select value from table1) 
    

    【讨论】:

    • 这不允许从一个源记录中获取大量目标记录。
    猜你喜欢
    • 2018-08-04
    • 2011-01-03
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多