Update:
我解决了之前的问题。现在代码已更新。结果是唯一的并且 ID 是正确的。但新问题:
结果行数通常小于要求 (8)。
因为我添加了CREATE UNIQUE INDEX topicid on rands (topicid);
拒绝SQL层的重复插入;无论插入被拒绝,循环 - 1。我现在正在寻找一种方法,例如:IF insert success THEN cnt-=1。你知道在 SQL 层有什么方法可以做到这一点吗?谢谢。
我有一个名为 topictable 的表,其中包含两列 - 主题和主题。我想从表中随机获取 8 行而不重复。我偷了代码here https://stackoverflow.com/a/9946238/727208并修改为获取两列结果。但我有两个问题。 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;}
感谢您的帮助。
抱歉,我没说清楚。该表中的所有主题一开始都是唯一的。但它们最终可能会重复,因为该函数有时会随机选择行,有时它只会选择同一行两次。感谢您的帮助。
感谢@tereško。这CONTINUE HANDLER FOR SQLSTATE '23000'
捕获“非唯一”错误并将 cnt 纠正回 +1。
DELIMITER $$
DROP PROCEDURE IF EXISTS get_rands$$
CREATE PROCEDURE get_rands(IN cnt INT)
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET cnt = cnt + 1;
DROP TEMPORARY TABLE IF EXISTS rands;
CREATE TEMPORARY TABLE rands ( topicid INT UNIQUE,topic VARCHAR(128) );
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 ;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)