1
  • 首先:我知道在一个字段中处理多个条目确实很糟糕,但我自己没有创建数据库,现在我必须使用它。它有大约 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, | ...  
4

2 回答 2

0

仅使用一条 sql 指令可能非常困难,我将在 MySQL 中执行以下功能:

1) 使用表 A 创建一个游标 2) 从表 B 中搜索每个值 3) 用 B 中的值填充 [new] 字段

20000 行并不算多。

于 2013-11-28T14:59:58.943 回答
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 表行
  • 关于性能问题,应该预先计算表并将其存储到数据库中(这就是我所做的)。
于 2013-12-05T14:34:20.443 回答