【问题标题】:Multiple values per field in a MySQL databaseMySQL 数据库中每个字段的多个值
【发布时间】:2013-12-14 16:00:48
【问题描述】:
  • 首先:我知道在一个字段中处理多个条目确实很糟糕,但是我自己没有创建数据库,现在我必须使用它。它有大约 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, | ...  

【问题讨论】:

  • 表A是新表吗?如果是这样,为什么不将结构更改为遵循关系数据库理论的结构 - 它不会从根本上改变问题的性质,但如果您不这样做,它将删除您将来会遇到的其他问题...
  • 更不用说如果你用字符串替换数字你会遇到像Smith, Jones这样的名字并被逗号混淆。
  • @RobBaillie A 是现有表 @BartFriederichs 我会检查GROUP_CONCAT
  • 倒霉!听起来你继承了野兽。如果您有能力更改表格的结构,我强烈建议您这样做 - 在遇到一些可怕的问题之前。

标签: php mysql multiple-entries


【解决方案1】:

我找到了解决问题的方法。但是,确实不建议每个字段使用多个条目。但是,如果您处于像我这样的情况,您必须使用这样一个非关系型数据库,而不允许更改方案,我们在这里:

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 表行
  • 关于性能问题,应该预先计算表并将其存储到数据库中(这就是我所做的)。

【讨论】:

    【解决方案2】:

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

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

    20000 行也不算多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-03
      • 2012-05-21
      • 2013-06-05
      • 2020-07-01
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多