更新:
我定了以前的问题。 现在的代码是否过时。 结果是独特的和ID是正确的。 但新的问题:结果行的量通常小于要求(8)。 因为我添加CREATE UNIQUE INDEX topicid on rands (topicid);
否认在SQL层重复插入; 环路 - 1无论是插入被拒绝。 现在我正在寻找像一个方法:如果插入成功,那么CNT-= 1。 你知道的任何方式在SQL层做到这一点? 谢谢。
我有一个表称为topictable包含两个coulmns-topicid和话题。 我想从表8个随机行,而不重复。 我偷了代码这里并修改成让两列的结果。 但我有两个问题吧。 1.它是不显着; 2. ID是错误的(我赶上莫名其妙的错误随机ID)。
DELIMITER $$
DROP PROCEDURE IF EXISTS get_rands$$
CREATE PROCEDURE get_rands(IN cnt INT)
BEGIN
DROP TEMPORARY TABLE IF EXISTS rands;
CREATE TEMPORARY TABLE rands ( topicid INT ,topic VARCHAR(128) );
CREATE UNIQUE INDEX topicid on rands (topicid);
loop_me: LOOP
IF cnt < 1 THEN
LEAVE loop_me;
END IF;
INSERT INTO rands
SELECT topictable.topicid,topictable.topic
FROM topictable
JOIN (SELECT (RAND()*(SELECT MAX(topictable.topicid) FROM topictable)) AS id) AS choices
WHERE topictable.topicid >= choices.id
LIMIT 1;
SET cnt = cnt - 1;
END LOOP loop_me;
END$$
DELIMITER ;
我使用下面的函数在PHP执行脚本。
function pickrandomtopics($amountoftopics,$dbh){
try {
$randtable="CALL get_rands($amountoftopics)";
$dbh->exec("$randtable");
$topictemp = $dbh->query('SELECT * FROM rands');
$topics = $topictemp->fetchAll(PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
echo $e->getMessage();
}
return $topics;}
感谢您的帮助。
对不起,我没有说清楚。 在这个表中的所有的主题都是在一开始是独一无二的。 但是,他们可能会重复在最后,因为函数不定时随机采行的时间,有时它只是挑同一行两次。 谢谢你的帮助。