2013-10-22 78 views
2

現在我有如何從表中選擇2個不同的隨機行?

row=session.query(Item).order_by(func.random()).limit(2) 
name1=row[0].name 
name2=row[1].name 

這使我的每個條目的第一列(名)。問題是,我得到倍數(它會選擇相同的隨機行兩次,我希望它總是不同的。有沒有辦法做到這一點,沒有一個if,然後聲明?

如果它的有用,當我打印行,它給了我這樣的事情:

SELECT items.id AS items_id, items.name AS items_name, items.data AS items_data FROM items ORDER BY random() LIMIT ? OFFSET ? 

它爲什麼會說限我已經把極限(2)

+0

當你說LIMIT 2時會出錯嗎? – Teja

+0

嗯我不知道。我在哪裏具體定義LIMIT 2.我以爲我是通過我的查看代碼與極限(2)在查詢結束 – BigBoy1337

+0

檢查我發佈的soln .. – Teja

回答

2

似乎在func.random()上使用order_by在SQL(http://www.webtrenches.com/post.cfm/avoid-rand-in-mysql)中是一個壞主意。相反,我計算了表格的長度,找到了2個隨機數字,然後查詢表格以查找與這些隨機數字關聯的行。顯然這更快。至少它沒有任何重複:)

number=session.query(func.count(Item.id)).scalar() 
randoms=random.sample(range(number),2) 
item1=session.query(Item).filter_by(id=randoms[0]+1).one() 
item2=session.query(Item).filter_by(id=randoms[1]+1).one() 
1
SELECT items.id AS items_id, items.name AS items_name, items.data AS items_data 
FROM items 
ORDER BY random() 
LIMIT 2; 

檢查下面的鏈接以供參考

0123。

+0

所以你是說.limit(2)部分不工作,這就是爲什麼它選擇兩次相同的條目? – BigBoy1337

+0

是的,這是... U沒有正確使用限制條款我覺得... – Teja

+0

但即使限制不起作用,它會返回整個表格。爲什麼會有重複的條目? – BigBoy1337