更新:
我修复了之前的问题。现在代码已更新。结果是唯一的,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;}
感谢您的帮助。
对不起,我没有说清楚。此表中的所有主题在开始时都是唯一的。但它们最后可能会重复,因为函数会不时随机选择行,有时它只会选择同一行两次。谢谢你的帮助。