2013-10-22 3 views
2

지금 나는 나에게 각 항목의 첫 번째 열 (이름을) 제공테이블에서 2 개의 임의의 행을 어떻게 선택합니까?

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

있습니다. 문제는, 나는 배수가된다 (같은 랜덤 행을 두 번 선택한다.) 항상 다르도록하고 싶다. if 문, then 문없이 이것을 수행하는 방법이 있는가?

만약 유용하다면, 내가 인쇄 할 때 행, 그것은 나에게 같은 것을 제공 :

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

이 왜 제한을 말할 것을 I (2)

+0

LIMIT 2라고 말하면 오류가 발생합니까? – Teja

+0

음, 확실하지 않습니다. 어디에서 구체적으로 제한을 정의 할 것인가 2. 질문의 끝에서 제한 (2)을 사용하여 내보기 코드를 통해 그렇게하고 있다고 생각했습니다 – BigBoy1337

+0

게시 된 질문을 확인하십시오 .. – 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

관련 문제