我有一张名为user_thoughts
的表格。该表有许多列,其中一列是favourited_by
。
thought
可能会受到许多不同用户的青睐,但我不想创建一个新行,说明此thought id
已偏好此user
。
我宁愿让它在一个字段中存储多个username
。所以favourited_by
例如可以保存这样的数据:
Alice, Fred, Freddy, Conor ....
全部在一行中。我试过在phpMyAdmin上弄乱data types
,但无法弄清楚该字段如何容纳多个数据。
答案 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;