0

我有一个包含几个表的数据库,这些表包含基本的静态 ID-to-name 数据。2 仅在每个这些参考表中的列。

然后我有另一个表将接收用户输入的数据。每个用户输入实例都有自己的带有时间戳的行,但这里的重要列将包含一个或几个与其他表之一中的名称相关的 ID。为了便于提交和检索此信息,我选择将其作为文本输入,采用 json 格式。

一切都很顺利,直到我意识到我需要将大表与小表连接起来以将名称引用到 ID。我还需要在结果中返回 ID。

此表中的几行可能如下所示的示例:

Column 1                            | Column 2                  | Timestamp
["715835199","91158582","90516801"] | ["11987","11987","22474"] | 2012-08-28 21:18:48
["715835199"]                       | ["0"]                     | 2012-08-28 21:22:48
["91158582","90516801"]             | ["11987"]                 | 2012-08-28 21:25:48

此表中将重复 ID# 的输入,但不一定在相同的分组中,因此我将 ID 与名称配对放在单独的表中。

有可能做一个WHERE name='any-of-these-json-values'吗?在我查询主表以提取我需要包含的名称的 ID 后,我最好在 php 中加入 ghetto 吗?还是我只需要完全重新设计数据输入表?

4

1 回答 1

1

首先:

如果您想单独访问它们,永远不要将多个信息放入一个字段中。绝不。

也就是说,我认为您将需要创建一个完整的N:M关系,其中包括一个连接表:示例表中的一行需要被连接表中的 1-N 行替换。

带有字符串匹配的棘手连接仅对极少数行执行可接受,并且WHERE name='any-of-these-json-values'在您的构造中是不可能的:MySQL 不“理解”这是一个 JSON 数组 - 它将其视为非结构化文本。在连接表上,这个子句很自然地出现WHERE somecolumn IN (1234,5678,8012)

编辑

假设您在Column 1其中包含 ID 数组并在table1其中Column 2携带 ID 数组,则table2您必须执行类似的操作

CREATE TABLE t1t2join (
  t1id INT NOT NULL ,
  t2id INT NOT NULL ,
  `Timestamp` DATETIME NOT NULL ,
  PRIMARY KEY (t1id,t2id,`Timestamp`) , 
  KEY (t2id)
)

(您可能需要对密钥进行健全性检查)

在插入时执行以下操作(在伪代码中)

Remember timestamp
Cycle all permutations of (Column1,Column2) given by user
Create row

因此,对于您的第三个示例行,SQL 将是:

SELECT @now:=NOW();
INSERT INTO t1t2join VALUES
  (91158582,11987,@now),
  (90516801,11987,@now);
于 2012-08-29T22:29:55.100 回答