0

アップデート:

以前の問題を修正しました。現在、コードは更新されています。結果は一意であり、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 回選択する場合もあります。ご協力いただきありがとうございます。

4

2 に答える 2

1

@teresko に感謝します。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 ;
于 2012-06-11T19:43:37.163 に答える
0

あなたの問題の1つを解決するために私はこれが役立つかもしれないと思います-SubQueryの使用

  • まず、すべての固有のトピックを選択します
  • 上記の返されたクエリから8つのランダムなトピックを選択します

これは単なるガイドラインであり、実際のクエリではありません

 select 8 random topics from
 (
  select all unique topics
 ) 
于 2012-06-09T19:42:04.860 に答える