在一个字段中存储多个数据(将数据存储在数据库中的数组中)

时间:2016-03-07 19:27:31

标签: php mysql

我有一张名为user_thoughts的表格。该表有许多列,其中一列是favourited_by

thought可能会受到许多不同用户的青睐,但我不想创建一个新行,说明此thought id已偏好此user

我宁愿让它在一个字段中存储多个username。所以favourited_by例如可以保存这样的数据:

Alice, Fred, Freddy, Conor ....

全部在一行中。我试过在phpMyAdmin上弄乱data types,但无法弄清楚该字段如何容纳多个数据。

2 个答案:

答案 0 :(得分:0)

处理此问题的理想方法是将其映射到另一个表,但是您可以将其存储为json。

MySQL 5.7甚至包含JSON作为数据类型,允许更容易的过滤和操作。

https://dev.mysql.com/doc/refman/5.7/en/json.html

您可以将json放入任何文本字段,但是如果您不需要搜索它等等。

答案 1 :(得分:0)

你要问的是错误的方式这样做。您不应将收藏夹数据序列化为user表或thought表的文本字段。这破坏了使用像MySQL这样的关系数据库的全部目的。

正确方法执行此操作:在user表和thought表之间创建交叉引用表。这利用多对多表来存储使用thought行和user行的主键的收藏列表。

您的新favorite表格:

CREATE TABLE IF NOT EXISTS `favorite` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int NOT NULL,
  `thought_id` int NOT NULL,
  PRIMARY KEY (`id`)
);

这样做是从id表中取user并将其存储在favorite.user_id中,然后将id表中的thought存储在favorite.thought_id中{1}}。

为身份为123的用户添加新的收藏夹,ID为456:

INSERT INTO favorite (user_id, thought_id) VALUES ('123', '456');

将标记了ID为456的思想的用户作为他们的最爱(使用JOIN):

SELECT u.* FROM favorite AS f
  JOIN user AS u ON u.id = f.user_id
  WHERE f.thought_id = 456;

与上一个查询类似,为ID为123的用户提供最喜欢的想法:

SELECT t.* FROM favorite AS f
  JOIN thought AS t ON t.id = f.thought_id
  WHERE f.user_id = 123;