MySQL数据库中每个字段的多个值

时间:2013-11-28 14:52:23

标签: php mysql multiple-entries

  • 首先:我知道在一个字段中使用多个条目真的很糟糕,但我自己没有创建数据库,现在我必须使用它。它有大约20000个条目,我现在真的不想改变它。
  • 我正在谈论的表 A 有一个带有一些ID的列,例如:,282,3358,123,
  • 这些ID与其他表 B 的主键匹配。 B 有另一个列名。
  • 我希望将这些名字放入我的表 A 替换这些ID
  • 示例:

表B

| ID |      name         |     
+----+-------------------+
|282 |      name_1       |
+----+-------------------+
|3358|      name_2       |
+----+-------------------+
|123 |      name_3       |

初始状况表A

 ... |         ID             | ...    
-----+------------------------+-----
 ... |    ,282,3358,123,      | ... 

表A的预期结果

 ... |         ID             | ...    
-----+------------------------+-----
 ... | ,name_1,name_2,name_3, | ...  

2 个答案:

答案 0 :(得分:0)

只有一个sql指令可能非常困难,我会在MySQL中执行一个函数:

1)用表A创建一个游标 2)搜索表B中的每个值 3)使用B

中的值填充[new]字段

20000行并不算太多。

答案 1 :(得分:0)

我找到了解决问题的方法。但是,每个字段使用多个条目真的不值得推荐。但是,如果你在像我这样的情况下,你必须使用这样一个无关联的计划数据库,而不允许改变方案,我们在这里:

SELECT [...] ,
(SELECT GROUP_CONCAT( table_B.name SEPARATOR ',' ) FROM table_B 
WHERE FIND_IN_SET ( B.ID , SUBSTRING ( table_A.ID , 2 , length( table_A.ID ) -2 ) ) >0 ) ,
[...]
FROM table_A

一些解释:

  • 需要SUBSTRING才能在多字段条目的开头删除“,”。例如:SUBSTRING ( ",282,3358,123," , 2 , length( ",282,3358,123," ) -2 )导致“282,3358,123”
  • FIND_IN_SET方法将值搜索到逗号分隔的字符串列表中,并返回值的索引。如果找不到任何值,则返回0.这就是为什么我将整个字符串与0进行比较。
  • GROUP_CONCAT方法连接匹配的名称。因此,它提供逗号分隔的字符串列表==> name_1,name_2,name_3

一些注释:

  • 使用此查询的效率非常低。该查询必须至少处理#ROWS_IN_TABLE_A * #ROWS_IN_TABLE_B表行
  • 关于性能问题,应该预先计算表并将其存储到数据库中(这就是我所做的)。