【问题标题】:SQL/PHP Conditional SELECT and UPDATESQL/PHP 条件选择和更新
【发布时间】:2014-08-18 11:43:35
【问题描述】:

我正在尝试从下表的 codes 列中返回 5 个未使用的值,然后将相关行中的 used 设置为 1。

|--- codes ---| | used |
| FIomQVu71l  | |   0  |
| 4TW0lwLWNK  | |   0  |
| SjzLB2Shzr  | |   0  |
| uTWJrtCgh4  | |   0  |
| tLwOwYGz5R  | |   0  |
| byEhzYMWJG  | |   0  |
| XFBmGzDGIR  | |   0  |

我已经设法让代码从 codes where used = 0 输出 5 个随机值

<?php
$sql = "SELECT codes FROM code_table WHERE used =0 ORDER BY rand() LIMIT 5";
$records = mysql_query($sql, $connection);
while($rows = mysql_fetch_array($records)){
echo "Code: " . $rows['codes'] . "<br />";
?>

但现在我不知道如何更新每个输出 codesused 值。我所有的尝试都将used 的每个实例更新为1,而不仅仅是与5 codes 关联的实例

【问题讨论】:

  • 为什么要先回码?
  • 完整代码基本上采用用户输入的值,检查它是否存在于一个表中,然后从另一个表向用户显示 5 个随机代码 - 然后我需要将这些代码标记为 used 以便当下一个用户输入一个值时,他们给出的 5 个随机代码是从那些未标记为已使用的代码中提取出来的。
  • 。 .我会以不同的方式处理逻辑。我将首先更新要使用的表——存储唯一的用户或会话标识符,而不仅仅是一个标志。然后我会取回用户“保留”的行。
  • 另外,ORDER BY rand() 可能会对性能产生不利影响。你应该看看alternatives

标签: php mysql sql


【解决方案1】:

您可以将行存储在临时表中。请注意,这并不完全是并发安全的。如果另一个查询出现在 insertupdate 之间,它可能会抓取相同的行。

CREATE TEMPORARY TABLE IF NOT EXISTS tmp_codes (codes varchar(50));

-- Get five new rows
INSERT INTO tmp_codes
        (codes)
SELECT  codes
FROM    code_table
WHERE   used = 0
ORDER BY
        rand()
LIMIT   5;

-- Update the five rows
UPDATE  code_table
SET     used = 1
WHERE   codes in
        (
        SELECT  codes
        FROM    tmp_codes
        );

-- Return to application
SELECT  codes
FROM    tmp_codes;

DROP TABLE tmp_codes;

Example at SQL Fiddle.

【讨论】:

    【解决方案2】:

    你应该执行一个更新查询:

    $sql = "SELECT codes FROM code_table WHERE used =0 ORDER BY rand() LIMIT 5";
    $records = mysql_query($sql, $connection);
    $codes = array();
    while($rows = mysql_fetch_array($records)){
        echo "Code: " . $rows['codes'] . "<br />";
        $codes[] = "'" . $rows['codes'] . "'";
    }
    $updateSql = "UPDATE code_table SET used = 1 WHERE codes in(" . implode (',' , $codes ) . ")";
    $res = mysql_query($updateSql, $connection);
    

    【讨论】:

    • 谢谢诺伊。这看起来正是我想要做的,但它似乎没有工作。页面没有加载,所以我将数组定义更改为 $codes = Array();现在它加载并且我的原始代码运行良好,但我仍然没有看到 used 值的任何变化
    • 您可能想查看代码唯一性?这段代码可能会导致为两个用户(同时运行逻辑)提供相同的代码。
    • @BillRoberts 你能回显 $updateSql 并尝试在 mysql 控制台\phpmyadmin 中运行结果吗?
    猜你喜欢
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2010-11-05
    • 2017-03-30
    • 2018-03-08
    • 2017-09-01
    相关资源
    最近更新 更多