2014-02-28 73 views
0

我正在尋找一種在MySQL中實現multiset(「包」)的標準方法。這個multiset可能包含的值只是字符串。實現multiset的標準方法?

它背後的原因是計數;我有一個事件清單,我不能預先定義,而且我希望統計它們的發生次數。例如,在Python中,這可以通過Counter完成。

以前我問過一個關於sets in MySQL的問題;我迄今發現的最佳解決方案是使用TEXT數據類型在數據庫中放入逗號分隔的字符串,然後使用FIND_IN_SET來查看元素是否在集合中。然而,這種解決方案是不利於多集,作爲存儲字符串,也就是說,在一個文本字段一千遍,再算上是,是不是有效?

使用情況是這樣的:每當一個事件在運行與給定行相關的我的(Python)腳本期間發生,我希望訪問數據庫並將該事件添加到數據庫中的每一行;最後,我希望統計每個行中每個事件的發生次數。對我來說更重要的是插入數據將是有效的(與最終計算相比)。

編輯

我的原始數據表包含數千行的,每個人都應該有一個「多集場」(這種或那種方式)。每個這樣的多重集可能包含不多的(比如少於20個)區別值,但是每個這樣的值可能在多重集中出現很多次(比如超過500次)。因此,每個值由其自身的字符串(或其他表示),等待稍後計算,可能效率低下(據我瞭解)。例如,任何(原始)行的任何事件將成爲一行的不同表格可能會迅速增長非常大(數百萬行)。

回答

2

鑑於這是你現有的表:

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 

爲了反映已更改的問題和來自發布者的評論而編輯

+0

也許您希望'按table1_event.event'分組?無論如何,這確實可以解決我的問題。然而,由於我的任何原始行可能包含〜100000個事件,並且我可能有成千上萬的原始行,這聽起來有點低效。我會編輯我的問題。 – Bach

+0

更新的答案看起來不錯,謝謝。 – Bach