2013-03-08 3 views
3

기본 키 _id 및 다음 쿼리를 사용하여 테이블 (사용자)에서 임의의 행을 검색하려고합니다. 확실히 어떤에 대해, 하나 개의 정수를 반환해야합니다 부질에서 어떤 결과로, MYSQL 쿼리에 여러 행이 표시되는 이유는 무엇입니까?

나는이 놀라운 찾을 ...

SELECT * 
FROM user 
WHERE _id IN (SELECT Floor(1 + (Rand() * (Count(_id) - 1))) 
       FROM user); 

행이 테이블에서 삭제되지 않았다 그러나 나는 (일관성) 여러 행을 반환받을 프라이 머리 키 ..... 항상 1 레코드이어야합니다!

@variables를 사용하여 임의의 행을 선택할 수 없기 때문에 하나의 쿼리를 사용하고 싶습니다. 아마도 준비된 문으로 만들 것이고 LIMIT 절을 사용하지 않을 것입니다. Server 버전 :

내 MySQL을 환영 문은 다음과 같이 내 버전이 나에게 말한다 5.5.29-0ubuntu0.12.04.2 (우분투)

+1

여러 있습니까 '같은 값의 _id'? 행을 반환하는 경우 문제가있는 _id1, count (_id1)> 1을 가진 사용자 그룹에서 SELECT _ID1, count (_id1)을 수행하십시오. –

+0

쿼리의이 부분을 실행 해보십시오 (FLOOR (1+ (RAND() * (COUNT (_id) -1))) 사용자로부터)'IN'을'='로 바꾸어보십시오. 에러가 발생하면 어디서 문제가 있는지 알 수 있습니다. –

+0

@MattBusche 고유 한'_id '값. http://www.sqlfiddle.com/#!2/2fda3/7을 참조하십시오. 0, 1 또는 2 개의 결과가 표시됩니다. – GolfWolf

답변

3

어떻게 쿼리에 ORDER BY RAND() LIMIT 1;를 사용하는 대신 where _id IN (select FLOOR(1+(RAND()*(COUNT(_id)-1))) from user);

에 대한 당신은 여러 행을 가져옵니다 (사용자가 FLOOR (1+ (RAND() * (COUNT (_id) -1)))를 선택하면 'user'테이블의 레코드에 대한 다른 값이 반환됩니다. 그것은 RAND 비트 때문입니다.

select FLOOR(1+(RAND()*(COUNT(_id)-1))) from user을 단독으로 실행하면 표시됩니다.

+0

이것은 훨씬 깨끗한 해결책입니다. – Trent

+1

이것은 좋은 해결책이지만 질문은 "어떻게 ..."이 아닌가? 그것은 "왜 여러 결과를 얻나요?" – GolfWolf

+0

내 편집 된 답변을 확인하십시오. –

1

무작위 부분은 한 행당 한 번 평가되므로 가끔씩 많은 행을 얻습니다. 가끔은 아무 것도 얻지 못할 수도 있습니다. 이렇게하려면 그것은 쉽고 빠르게 사용과 동등 조인 및

SELECT 
    * 
FROM 
    user 
WHERE 
    _id > (
     SELECT 
      FLOOR(1+(RAND()*(max(_id)-min(_id)))) 
     FROM 
      user 
    ) LIMIT 1 
; 
+0

평가가 안된다고 생각합니다. 행당 한 번; 그것은'count'를 사용하기 때문에 항상 하나의 값을 산출하는 집계입니다. 하위 쿼리 ('사용자가 선택한 FLOOR (1+ (RAND() * (COUNT (_id) -1)))를 여러 번 실행하여이 문제를 확인할 수 있습니다. – GolfWolf

+1

+1 나는 그것을 뒤로 가져 간다. 나는 이것이 이상한 결과에 대한 설명 일 수 있다고 생각한다. – GolfWolf

0
select * 
from user join (select FLOOR(1+(RAND()*(COUNT(_id)-1))) as _id from user) as Temp 
on user._id=Temp._id 

바이올린을 제한 - http://sqlfiddle.com/#!2/2fda3/11

+0

일부 행이 삭제되면 작동하지 않습니다 (http://sqlfiddle.com/#!2/9f6c8/1). –