我正在寻找在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/

10-13 02:25