2011-08-21 39 views
0

我有一個數據庫,其中包含法語單詞,並希望顯示他們沒有重複。我不想檢索所有這些數據並將其放入數組中,因爲我認爲如果我有1.000.000.xxx的話,這將會很困難並且不會優化。我想挑選一個,當我想挑選另一個時,先前挑選的單詞不會出現在結果中。隊列算法檢索未顯示

有什麼算法適合這個嗎? PS:如果代碼適合MsSQL,C#會更好。

編輯:我想根據它們的頻率顯示新的和隨機的單詞。例如:表中有4個單詞,用戶希望更頻繁地看到單詞2和4,但第一個單詞是已知的,不想看到它。我想更頻繁地顯示第2個和第4個單詞,但更罕見第3個單詞。但在每一個顯示的我不想重複顯示相同的單詞

+0

你使用哪個數據庫引擎? –

+0

你正在使用哪個數據庫?一個SQL解決方案可能是有關db的知識。 –

+0

你是否需要爲每個用戶單獨使用? – svick

回答

0

與表Words像這樣用一個字一個字的每一行

create table Words 
(
    Word varchar(25) primary key, 
    Freq int not null 
) 

你可以使用order by newid()一個隨機單詞。

select top 1 Word 
from Words 
order by newid() 

頻率列是int其中的每一個字具有至少一個1和詞語即更頻繁的具有更高的值。要使用order by newid(),我們必須創建一個表格,其中包含freq值較高的單詞的重複項。這可以使用tally table完成。

要跟蹤您已選擇的單詞,您可以使用其他表格。

create table PickedWords 
(
    Word varchar(25) primary key 
) 

這是你的語句來選定單詞添加到表PickedWords和使用output子句字返回給客戶端。

insert into PickedWords 
output inserted.Word 
select top 1 W.Word 
from Words as W 
    inner join tsqlc_Tally as T 
    on W.Freq > T.N 
where W.Word not in (select Word 
        from PickedWords) 
order by newid() 

對於一個真正令人傷心的筆記本電腦,使用1.2 GHz處理器處理1.000.000字時,需要9秒。

如果您的表格中已經有重複的單詞而不是頻率列,那麼我們可以跳過理貨表,需要2秒來選擇一個單詞。

1

你想選擇一個單詞,如果這個單詞被重複,discardit。對?

試試這個:

pick a word 
search in a Map 
if the word is in the Map 
    repited word 
else 
    new word, insert in Map 
1

在Oracle中,你可以使用ROWNUM做到這一點:

SELECT WORD FROM (SELECT DISTINCT WORD FROM WORDS) 
WHERE ROWNUM >= :START_INDEX AND ROWNUM <= :END_INDEX 

在MySQL中,你可以使用限制功能:

SELECT DISTINCT WORD FROM WORDS 
LIMIT :NUMBER_OF_WORDS OFFSET :START_INDEX 
1

如果你使用MS SQL,試用RowNumber()

如果您正在開發C#應用程序,請在.NET Framework中嘗試使用支持的控件SQLDataAdapterDataSet

+0

RowNumber ok,但是我將如何處理從Row_Number()函數生成的列? – uzay95

+0

我第一次讀這個話題,我認爲它是在談論分頁(在那之後,我插入了一些在** .NET FrameworkWork **中工作的控件支持)。如果這是您要查找的內容,可以使用** RowNumber()**輕鬆搜索。 – BachT