【问题标题】:mySQLi select and update in the same time [duplicate]mySQLi同时选择和更新[重复]
【发布时间】:2017-07-27 09:11:31
【问题描述】:

我有一张表 numbers 有 3 列 idnumberts

我想随机选择 ts 为 NULL 的 10 条记录来获取它们,同时用当前时间戳更新它们的 ts,以便下一次选择我不会得到相同的结果,并且知道每个 @ 987654326@已被选中。

$ts = time();

$query = 'UPDATE numbers SET ts = ' . $ts . ' WHERE number IN (SELECT number FROM (SELECT number FROM numbers WHERE ts IS NULL ORDER BY RAND() LIMIT 10) AS t)';
if (!$stmt = $mysqli->prepare($query)) {
    echo $mysqli->error;
}
$stmt->execute();
$stmt->bind_result($number);
$stmt->store_result();

while ($stmt->fetch()) {
    echo $number . '<br>';
}

这里我不需要任何 bind_param() 因为没有外部输入。

现在,这个查询返回

警告:mysqli_stmt::bind_result():绑定变量的数量与准备好的语句中的字段数量不匹配...

【问题讨论】:

  • UPDATE 查询的结果是 TRUE 或 FALSE,因此没有要绑定的结果
  • 你是对的,如何从 SELECT 中获取结果?
  • 没有 SELECT,select 是一个子查询,因此只用作主查询来限制主 UPDATE 查询的作用
  • 如果您想知道哪些行被更新,您必须将该过程拆分为一个 SELECT 查询和一个 UPDATE 查询,并从 SELECT 查询结果手动构建 IN 列表

标签: php mysql mysqli


【解决方案1】:

只需使用此查询

$query = 'UPDATE numbers SET ts = " . $ts . " WHERE number IN (SELECT number FROM numbers WHERE
          ts IS NULL ORDER BY RAND() LIMIT 10)';

修改:-
我只是删除额外的选择语句并更正引号

【讨论】:

    【解决方案2】:

    我找到了,更新,然后选择更新的行 where ts = $ts

    $ts = time();
    
    $query = 'UPDATE numbers SET ts = ' . $ts . ' WHERE ts IS NULL ORDER BY RAND() LIMIT 10';
    if (!$stmt = $mysqli->prepare($query)) {
        echo $mysqli->error;
    }
    $stmt->execute();
    $stmt->close();
    
    $query = 'SELECT number FROM numbers WHERE ts = ' . $ts . ' ORDER BY RAND()';
    if (!$stmt = $mysqli->prepare($query)) {
        echo $mysqli->error;
    }
    $stmt->execute();
    $stmt->bind_result($number);
    $stmt->store_result();
    
    while ($stmt->fetch()) {
        echo $number . '<br>';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 2021-07-18
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多