如何在MySQL中随机选择每个用户ID(列)的5%行?

时间:2012-08-21 06:59:08

标签: mysql random-sample

如何使用MySQL随机选择每个用户标识列的5%行?

也就是说,mytable包含userid列,我想随机检查每个用户5%的输入行。因此查询应该返回每个用户行的5%。

2 个答案:

答案 0 :(得分:7)

你可以说:

SELECT * FROM mytable ORDER BY RAND() LIMIT 5

如果你知道表格中有100行。

如果您不知道,可以先尝试此查询,然后找出:

SELECT COUNT(*) FROM mytable

否则,您也可以尝试:

SELECT * FROM mytable WHERE RAND() < 0.05 ORDER BY RAND()

这会选择所有行的大约5%(但它有点随机,因为它基本上选择了5%的几率行。)

否则,您可以使用子查询:

SELECT * FROM mytable ORDER BY RAND() LIMIT (SELECT COUNT(*) FROM mytable)

答案 1 :(得分:-1)

我通过使用事件获得了解决方案:

drop event OEAuditEvent;

DELIMITER $$

CREATE EVENT OEAuditEvent
ON SCHEDULE EVERY 1 SECOND
STARTS '2012-09-05 09:00:00'

DO
BEGIN

  DECLARE a CHAR(20);
  DECLARE b,c,d INT;
  DECLARE done INT DEFAULT FALSE;

  IF CURRENT_TIME() = '23:40:00' THEN
begin

 DECLARE cur CURSOR FOR select OE_User,count(OE_User) from RNCM_Status where     date(OE_Date)=CURDATE() group by OE_User;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

 OPEN cur;
 read_loop: LOOP


 FETCH cur INTO a, b;

SET c=ceil((b*5)/100);

IF done THEN

          LEAVE read_loop;
ELSE
          insert into OE_Audit(MDN,CAF,UploadedDate,OEUser,OEDate,UserCount,QCCount,intime) select MDN,CAF,UploadedDate,OE_User,OE_Date,b,c,now() from RNCM_Status where OE_User=a and date(OE_Date)=CURDATE() order by rand() limit c;
    END IF;

 END LOOP;
  CLOSE cur;
 end ;
 END IF;

END $$

DELIMITER ;