SQL:检查插入成功(在任务从表中得到8个不同的随机行有两列)(SQL: check insert

2019-07-29 19:30发布

更新:

我定了以前的问题。 现在的代码是否过时。 结果是独特的和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;}

感谢您的帮助。


对不起,我没有说清楚。 在这个表中的所有的主题都是在一开始是独一无二的。 但是,他们可能会重复在最后,因为函数不定时随机采行的时间,有时它只是挑同一行两次。 谢谢你的帮助。

Answer 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 ;


Answer 2:

为了解决你的问题,我认为这可能帮助之一 - 使用子查询

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

。这仅仅是一个指导线,而不是实际的查询

 select 8 random topics from
 (
  select all unique topics
 ) 


文章来源: SQL: check insert successful (in a task to get 8 distinct random rows from a table with two columns)