我正在寻找在MySQL中实现多集(“包”)的标准方法。此多重集可能包含的值仅是字符串。
背后的原因很重要。我有一个事件列表,我无法预先定义,我希望对它们的发生进行计数。例如,在Python中,这可以通过Counter完成。
以前我问过一个关于sets in MySQL的问题;到目前为止,我发现的最佳解决方案是使用TEXT
数据类型将逗号分隔的字符串放入数据库中,然后使用FIND_IN_SET
来查看元素是否在集合中。但是,此解决方案不适用于多集,因为在文本字段中存储一个字符串(例如一千次)然后计数是不够有效的...
用例是这样的:只要在我的(Python)脚本运行期间发生与给定行相关的事件,我都希望访问数据库并将该事件添加到数据库中的每个行中;最后,我希望计算每一行中每个事件的发生次数。对我而言,更重要的是数据的插入将是有效的(与最终计算相比)。
编辑
我的原始数据表包含数千行,每行应有一个“多集字段”(一种或另一种方式)。每个这样的多集可能包含的识别值不会太多(例如,少于20个),但是在多集中每个这样的值可能会出现很多次(例如,大于500次)。因此,由每个值组成的字符串(或其他表示形式)可能会导致效率低下(据我所知)。例如,在一个不同的表中,任何(原始)行的任何事件都将构成一个行,该表可能很快会变得非常大(数百万行)。
最佳答案
鉴于这是您现有的表:
create table table1(thekey int primary key, random_info varchar(10))
创建您的事件表:
create table table1_event(thekey int not null, event varchar(100) not null,
counter int, primary key(thekey, event))
对于每个事件:
insert into table1_event values(<a key>, 'the event', 1)
on duplicate key update counter=counter+1
事件摘要:
select table1.thekey, table1_event.event, table1_event.counter
from table1 left outer join table1_event on table1.thekey=table1_event.thekey
编辑以反映海报中已更改的问题和评论
关于mysql - 实现多集的标准方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22090513/