2012-09-30 1 views
4

내가 userid 만의 고유 포함하는 다수의 임의 행을 검색하려고하지만 type 열이 무작위로에 대한id/auto_increment 컬럼없이 MySQL에서 임의의 행을 여러 개 검색하는 방법은 무엇입니까?

내 목표 - type0 또는 1 될 수 있습니다. 해당 테이블에는 주어진 시간에 1,000 개 미만의 행이 포함됩니다. ORDER BY RAND()를 사용

을 배제하기 위해 무엇

내 테이블

CREATE TABLE tbl_message_queue (
    userid bigint(20) NOT NULL, 
    messageid varchar(20) NOT NULL, 
    `type` int(1) NOT NULL, 
    PRIMARY KEY (userid,messageid,`type`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

샘플 데이터

userid | messageid | type 
--------------------------------------------------- 
4353453 | 518423942 | 0 
4353453 | 518423942 | 1 
2342934 | 748475435 | 0 
2342934 | 748475435 | 1 
7657529 | 821516543 | 0 
7657529 | 821516543 | 1 
0823546 | 932843285 | 0 
0823546 | 932843285 | 1 

는 이러한 유형의 최소 18,000 이상으로 가능하지 않다 쿼리가 실행됩니다. b y 애플리케이션에서 발생하며 높은로드를 유발합니다. SELECT DISTINCT 또는 GROUP BY을 사용하면 더 효율적이며 항상 고유 한 userid을 선택할 수 있지만 type은 항상 허용되는로드로 0과 같습니다.

일반적인 방법은 id 열을 만드는 것이지만 대체 방법을 찾고 있습니다 . 그룹 기본 키는 필요에 따라 변경 될 수 없으며 애플리케이션에 깊이 통합되지만 각 열의 구조는 변경 될 수 있습니다.

감사합니다. 질문의

+0

샘플 데이터 세트를 기준으로 'change'값이 'type'인 것처럼 보입니다. 그것은 단지 1과 0이기 때문에, 왜 1과 0 값의 무작위 화를하지 않을까요? – dispake

답변

2

나의 이해는 각 userid 당신이 항목이 있지만, 무작위로 만 추출 할 것입니다.

이를 위해, 당신은 각각의 고유 한 userid 0과 1 사이의 임의의 값을 생성한다고 한 다음 시작 목록이리스트에 가입하려면 :

SELECT a.* FROM tbl_message_queue AS a 
    JOIN (SELECT userid, FLOOR(2*RAND()) AS type 
      FROM tbl_message_queue GROUP BY userid) AS b 
    ON (a.userid = b.userid AND a.type = b.type); 

을하지만, ORDER BY RAND() 경우 작동하지 않습니다 어쩌면 우리는 타협해야합니다. 사용자 A가 0 당신과 함께 켜집니다 어떤 사용자 B에 대해 아무것도 알 수없는 입력 가도록 즉, 사실 - 위의 순서에서

는 두 사용자 ID는 상관 될 것입니다.

은 사용 사례에 따라 덜 임의 (그러나 "분명히 무작위") 시퀀스는 두 개의 쿼리를 얻을 수 있습니다 :

SELECT @X := FLOOR(2*RAND()), @Y := POW(2,FLOOR(2+14*RAND()))-1; 

SELECT * FROM tbl_message_queue WHERE (((userid % @Y) & 1) XOR type XOR @X); 

이 방법, 당신은 무작위 추출을 보이는 얻을 수 있습니다. 실제로 일어나는 일은 사용자 ID가 이고 숫자가이고 몇 가지 다른 추출이 가능할뿐입니다. 그러나 간단한 연산자 만 사용하고 JOIN을 사용하지 않으면이 쿼리가 매우 빠릅니다.

+0

신속하고 설명적인 응답을 보내 주셔서 감사합니다. 정확히 제가 요구했고 또한 매우 효율적입니다. – Ajay

관련 문제