0

更新:

我修复了之前的问题。现在代码已更新。结果是唯一的,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;}

感谢您的帮助。


对不起,我没有说清楚。此表中的所有主题在开始时都是唯一的。但它们最后可能会重复,因为函数会不时随机选择行,有时它只会选择同一行两次。谢谢你的帮助。

4

2 回答 2

1

谢谢@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 ;
于 2012-06-11T19:43:37.163 回答
0

为了解决您的一个问题,我认为这可能会有所帮助 - 使用 SubQuery

  • 首先选择所有独特的主题
  • 从上面返回的查询中选择 8 个随机主题

.这只是一个指导方针,而不是实际的查询

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