我目前有一张桌子上有一个人的用户名,密码,电子邮件和物品(我的意思是你可以在游戏中收集的物品,也称为“库存”)。但是,如何在items列中添加多个项目?例如,如果我想在这里添加项目A,B和C:
答案 0 :(得分:11)
您应该使用2个表来存储此数据。
users: username | password | email
-------------------------
items: username | item
然后,您可以在第二个表中为给定用户名插入无限数量的项目(每个项目都是新记录)。
然后,您可以选择一个用户的所有项目,如下所示:
SELECT item FROM items WHERE username = ?
您还可以通过多种方式组合这两个表。
/* this one selects all users who have a specific item */
SELECT u.* FROM users u JOIN items i ON u.username = i.username WHERE i.item = ?
您希望如何使用这些数据?
您还应该开始使用ID值(数字),这样您就不必浪费空间重复基于文本的内容,例如用户名。
我认为这可能是一个非常好的方式,但是你能告诉我你的意思是每个项目是一个新记录吗?我还是有点困惑。
您可以插入如下值:
insert into items values ('jonathan', 'hat');
insert into items values ('jonathan', 'drink');
insert into items values ('jonathan', 'mouse');
insert into items values ('user1981730', 'hat');
insert into items values ('user1981730', 'mouse');
哪会导致这个:
然后,您可以查询将饮用作为项目的所有用户:
SELECT u.* FROM users u JOIN items i ON u.username = i.username WHERE i.item = 'drink'
然后获取 user1981730 获得的所有项目的列表:
SELECT item FROM items WHERE username = 'user1981730'
如果您对此感到满意,我们可以讨论添加ID列。
ID列是什么意思?
请注意,在上面的示例中,items表有很多重复信息。用户名 jonathan 重复3次,项目 hat 重复两次。对于真正的数据库,情况会更糟。
我们可以通过使用整数ID来表示每个唯一值来节省空间并通常提高性能。每个用户都有一个ID,每个唯一的项目都有。
让我们从用户开始吧。我们必须将新列添加到users表。
我们将其设为 PRIMARY KEY ,这将确保所有值都是唯一的,这样就不会有2个用户拥有相同的ID。我们还可以使用 AUTO_INCREMENT 使值随每条新记录自动增加。
然后我们会更改项目表,以便它使用新列而不是用户名。
请注意我们仍然拥有与之前相同的信息。 ID号为1的用户有饮料,帽子和鼠标,ID号为2的用户有帽子和鼠标。
我们仍然可以像以前一样进行相同的查询(进行一些小的更改)。
/* this selects all the items for a known user_id */
SELECT item FROM items WHERE user_id = ?
/* this selects all the items for a user when we only know the username */
SELECT i.item FROM items i JOIN users u ON u.user_id = i.item_id WHERE u.username = ?
/* this one selects all users who have a specific item */
SELECT u.* FROM users u JOIN items i ON u.user_id = i.user_id WHERE i.item = ?
到目前为止,我们只修改了表格以避免重复用户名。如果我们还想避免重复项目名称,我们可以添加一个额外的表格。这开始变得棘手,所以我不会详细介绍(目前),但表格结构如下:
users: username | password | email
-------------------------------
items: item_id | name
-------------------------------
users_items: user_id | item_id
用户表格与以前一样。 项表具有新角色,并存储所有唯一项。 users_items 表现在链接其他两个表。
我将在此结束SO答案。如果您有任何其他问题,可以通过电子邮件向我发送上面列出的地址(示例表中使用的地址)。
答案 1 :(得分:1)
在单独的表格中为每个项目添加一行。
INSERT INTO items (userid, item) VALUES
(1, 'item number 1'),
(1, 'item number 2'),
(1, 'item number 3');
不要将所有项目放在用户表格的一行中。 JSON,逗号分隔值和其他技术可能听起来很诱人,但它们不是真正的解决方案。如果在一个专用于跟踪它们的表中每个项目有一行,那么您的SQL和逻辑将 更简单,更清晰。
答案 2 :(得分:0)
您有几种选择。要么(如果用例足够简单),只需编码多个值,例如,用逗号分隔。
但是,干净的方法是使用另一个表,每个项目创建一个条目,并有一个指向第一个表的外键。