SQL:检查插入是否成功(在从具有两列的表中获取 8 个不同的随机行的任务中)

2024-07-03

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(使用前将#替换为@)

SQL:检查插入是否成功(在从具有两列的表中获取 8 个不同的随机行的任务中) 的相关文章

随机推荐

  • 创建代表“今天”的 NodaTime LocalDate

    创建代表 今天 的 LocalDate 实例的推荐方法是什么 我原以为 LocalDate 类中有一个静态的 Now 或 Today 属性 但没有 我当前的方法是使用 DateTime Now var now DateTime Now Lo
  • 使用sql删除重复行

    我正在尝试从 mysql 表中删除重复的行 我尝试了多个查询 但不断收到此错误 1093 You can t指定目标表 usa city 以在 FROM 子句中进行更新 该表如下所示 usa city id pk id state city
  • 是否可以更改默认的 html5 视频皮肤/颜色

    是否可以更改默认 html5 视频播放器的颜色或完整皮肤
  • WebView 和 SSL 证书

    我在使用 Android WebView 加载受 SSL 保护的网页时遇到问题 我总是收到如下错误 onReceivedSslError primary error 3 certificate Issued to CN intranet
  • 如何使用 Knockout 和自定义绑定将 JSON DateTime 转换为可读的日期和时间

    我将 KnockoutJS 与映射插件一起使用 除了 DateTime 字段之外 一切都运行良好 该字段被序列化为刻度 如下所示 Date x 其中 x 刻度 我会怎样 1 将日期对象解析为人类可读的形式 2 将其从自定义绑定返回到模型中的
  • Pip要求输出全局包

    我的 django 项目有一个虚拟环境 但是当我点击pip freeze 我得到的一定是一个全局站点包列表 包括太多的包 比如 ubuntu 包和很多不相关的东西 无论 virtualenv 是否处于活动状态 都会发生这种情况 我的站点包列
  • Angular 2:NgbModal 在视图中嵌入

    假设我有这样的模态模板 div class modal header h3 h3 div div class modal body div
  • Javascript - window.location.assign 不起作用

    我有一个项目 我扫描二维码 然后它会根据扫描的代码自动打印出信息 我有扫描仪和打印机 每个二维码都对应一个URL 我可以让扫描仪填充输入字段 并且可以收到警报以显示扫描的信息 但是 每当我尝试分配 URL 时 它只是将信息附加到当前 URL
  • Visual Studio 2012 最近的项目未在任务栏中更新

    我已将 Visual Studio 固定到任务栏 用鼠标右键单击该图标时 会显示最近的项目和解决方案的列表 这曾经工作正常 但从现在起 该列表不再更新 我总是在下面看到相同的项目和解决方案Recent 尽管我最近参与了较新的项目 我该如何修
  • Google 云消息传递:如何使用 SHA1 证书?

    我有个疑问 我开发了一个 Android 应用程序 它通过 Google Cloud Messaging 接收推送通知 以下是我采取的步骤 在 Google Developer 控制台上创建新项目 并将我的项目编号复制 粘贴到我的 Andr
  • 如何使用 mongoose 连接到两个不同的数据库?

    我有两个数据库 一个数据库影响另一个数据库 所以我想看看是否有一种方法可以连接两个数据库 以便一个模型可以与另一个数据库关联 而另一个模型可以专注于差异数据库 目前我的模型如下所示 var mongoose Schema Moduser O
  • 水平滚动视图 - xamarin.forms

    我知道有很多关于这个话题的 在 Xamarin Forms ScrollView 中水平滚动 https stackoverflow com questions 24389661 scroll horizontally in xamarin
  • $(window).width 的条件行为

    当窗口高于 1278 像素时 我想要特定的 mouseenter 和 mouseleave 行为 对于低于 1278 的宽度 我想禁用此切换行为 并将 2 个元素设置为 1 个状态 可见和活动 如果浏览器宽度大于 1278 我还必须将状态重
  • 文件夹或 SQL Server 作为二进制存储图像的更好方法是什么?

    我正在计划为客户开发一个照片库应用程序 我正在 asp net 3 5 中开发该应用程序 并希望开发它 以便我可以使用各种前端跨多个平台重复使用该应用程序 基本上 我想知道将图像作为二进制文件存储在数据库中与简单地将文件存储在应用程序文件夹
  • SSH认证后仍需要登录

    我遵循了 GitHub 教程中的所有内容 https help github com articles generate ssh keys https help github com articles generating ssh keys
  • 从t-sql中找出sql server服务已经运行了多长时间

    我想是否可以从 sql server 内部计算出 sql server 已经运行了多长时间 想要将其与 DMV 之一结合使用以获取未使用的索引 但每次 sql server 加载时计数器都会重新设置 所以我想知道它们会有多大用处 SELEC
  • 将 Cdk Overlay 放置在 Angular/Elements Web 组件内

    我有一个更复杂的 Angular 应用程序 我想将其部署为 Angular elements Web 组件 该应用程序使用 mat dialog 并且 Web 组件也不会占用 100 的浏览器窗口大小 我的问题是 mat dialog 的
  • 如何为 kube-scheduler 创建配置文件以供 --config 参数使用

    从 kubernetes 1 9 开始 kube scheduler 上已弃用 config 之外的所有标志 那么如何创建配置文件呢 从提示开始构建并使用 write config to生成一个示例配置文件 检查它 它是一个 yaml 文件
  • ListView 显示错误且重复的图像

    我有一个 ListView 和 12 个 ImageView 每个 ImageView 都有从 url 加载的不同图像 无论我是否滚动 图像都会被打乱 有时甚至会重复 我尝试了其他 10 种方法来解决这个问题 但都没有成功 这是我下载并显示
  • SQL:检查插入是否成功(在从具有两列的表中获取 8 个不同的随机行的任务中)

    Update 我解决了之前的问题 现在代码已更新 结果是唯一的并且 ID 是正确的 但新问题 结果行数通常小于要求 8 因为我添加了CREATE UNIQUE INDEX topicid on rands topicid 拒绝SQL层的重复