アップデート:
以前の問題を修正しました。現在、コードは更新されています。結果は一意であり、ID は正しいです。しかし、新しい問題: 結果行の量は、多くの場合、要件 (8) よりも少なくなります。CREATE UNIQUE INDEX topicid on rands (topicid);
SQLレイヤーでの繰り返し挿入を拒否するために追加したためです。ループ - 挿入が拒否されても 1。私は今、次のような方法を探しています: IF 挿入成功 THEN cnt-=1. SQLレイヤーでこれを行う方法を知っていますか? ありがとう。
2 つの列トピック ID とトピックを含む topictable というテーブルがあります。繰り返しなしで、テーブルから 8 つのランダムな行を取得したいと考えています。ここからコードを盗み、2 つの列の結果を取得するように変更しました。しかし、私には2つの問題があります。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;}
助けてくれてありがとう。
申し訳ありませんが、明確にしませんでした。この表のすべてのトピックは、最初は固有です。ただし、関数は時々ランダムに行を選択するため、最後に重複する可能性があります。同じ行を 2 回選択する場合もあります。ご協力いただきありがとうございます。