2011-11-27 59 views
1

我有一个表,名为用户,其中一行需要保存用户所做的所有操作,并且操作被引用为action_ids我应该如何将多个值存储到SQL行中?

我该如何让行持有多个action_ids

例如,假设用户执行了5个操作,每个操作都有ID 100001,100002,100003,100004,100005。如何将其存储到数据库中,以便稍后说出用户所做的所有操作?

该行可能必须存储数百或数千个6位数值。

+0

你可以使用'implode'和'explode'或JSON使用。 – JCOC611

+1

@ JCOC611:这是一个坏主意,因为它会使复杂的其他简单查询变得复杂。例如:选择不包含特定值的行。你现在不得不在每一行中破坏这个价值。此外,您错过了一次为该领域编制索引的机会。 –

+0

@SimpleCoder:你是对的...我想这取决于具体用途(如果你不需要做这样的查询,也不需要索引字段,那么这是一个选项;否则,创建一个新表将是最好的)。 – JCOC611

回答

6

我建议你创建一个UserAction表,其中UserIdActionId。通过这种方式,您可以参考完成的操作,而无需在您的users表的一行中存储多个值。

您将存储用户执行的每个操作的行。该表可能是这样的:

SELECT ua.UserId, ua.ActionId 
FROM UserAction AS ua 
ORDER BY ua.UserId ASC, ua.ActionId ASC 
LIMIT 5 

结果:

1, 100001 
1, 100002 
1, 100007 
2, 100002 
2, 100003 

含义是用户ID = 1进行动作100001,100002和100007和用户ID 2执行的100002和100003

这样做也有助于保持数据库的标准化,使未来的查询更容易。

您将能够发现使用此结构的用户更容易执行多少操作(以及其他任务),而不是使用文本/字符串值解析列:(我假设您有一个名称或类似的字段)

SELECT u.Name, COUNT(1) AS NumberOfActionsPerformed 
FROM users AS u 
INNER JOIN UserAction AS ua ON u.userId = ua.UserId 
GROUP BY u.userId, u.Name 
ORDER BY NumberOfActionsPerformed DESC 

而且,如果我做的表,我想补充UserActionId为自动增量ID列我Primary Key

+0

这并不能解决我的问题,我应该如何将潜在的成千上万的6位数值存储到行ActionId中,就像你所建议的那样? – Ayub

+1

您在UserAction表中为每个操作创建一行。查找'加入MySQL表' – Chris

+0

@MrMalayev我已经更新了我的答案,以显示此表中的数据可能是什么样子。 –

相关问题