【问题标题】:php sql find and insert in empty slotphp sql查找并插入空槽
【发布时间】:2011-11-22 21:42:40
【问题描述】:

我设置了一个游戏脚本,当它创建一个新角色时,我希望它为那个玩家的房子找到一个空地址。

它插入的两个相关表格字段是“城市”和“数字”。 'city' 是 10 中的随机数,'number' 可以是 1-250。

但它需要做的是确保它在“HOUSES”表中找到的 2 个随机数不存在条目,如果有,则更改数字。重复直到找到未使用的“地址”,然后将其插入。

我设置了一种方法来执行此操作,但我知道它是伪劣的 - 可能有一些更合乎逻辑和更简单的方法。有什么想法吗?

更新

这是我当前的代码:

$found = 0; 
while ($found == 0) {
    $num = (rand()%250)+1; $city = (rand()%10)+1;
    $sql_result2 = mysql_query("SELECT * FROM houses WHERE city='$city' AND number='$num'", $db); 
    if (mysql_num_rows($sql_result2) == 0) { $found = 1; }
}

【问题讨论】:

    标签: php sql random


    【解决方案1】:

    您可以像以前一样在 PHP 中执行此操作,也可以使用 MySQL 触发器来执行此操作。

    如果你坚持 PHP 方式,那么不要每次都生成一个数字,而是这样做

    $found = 0;
    
    $cityarr = array();
    $numberarr = array();
    
    //create the cityarr
    for($i=1; $i<=10;$i++)
        $cityarr[] = i;
    
    //create the numberarr
    for($i=1; $i<=250;$i++)
        $numberarr[] = i;
    
    //shuffle the arrays
    shuffle($cityarr);
    shuffle($numberarr);
    
    //iterate until you find n unused one
    foreach($cityarr as $city) {
        foreach($numberarr as $num) {
            $sql_result2 = mysql_query("SELECT * FROM houses 
                                        WHERE city='$city' AND number='$num'", $db); 
            if (mysql_num_rows($sql_result2) == 0) {
                $found = 1;
                break;
            }
        }
        if($found) break;
    }
    

    这样你不会多次检查同一个值,你仍然随机检查。

    但您确实应该考虑在循环之前获取所有记录,因此您只有一个查询。这也会大大提高性能。

    喜欢

    $taken = array();
    for($i=1; $i<=10;$i++)
        $taken[i] = array();
    
    $records = mysql_query("SELECT * FROM houses", $db);
    while($rec = mysql_fetch_assoc($records)) {
        $taken[$rec['city']][] = $rec['number'];
    }
    
    for($i=1; $i<=10;$i++)
        $cityarr[] = i;
    for($i=1; $i<=250;$i++)
        $numberarr[] = i;
    
    foreach($cityarr as $city) {
        foreach($numberarr as $num) {
            if(in_array($num, $taken[]) {
                $cityNotTaken = $city;
                $numberNotTaken = $number;
                $found = 1;
                break;
            }
        }
        if($found) break;
    }
    
    echo 'City ' . $cityNotTaken . ' number ' . $numberNotTaken . ' is not taken!';
    

    我会用这种方法:-)

    【讨论】:

      【解决方案2】:

      如果只剩下一对(甚至还剩 1 个),按照您说的方式进行操作可能会导致问题。脚本可能需要很长时间才能找到空房子。

      我建议在数据库中插入所有 2500 条记录(组合 1-10 和 1-250)并标记它是否为空(或使用用户 house 创建组合表)并将其匹配那个。

      使用 MySQL,您可以从数据库中随机选择一个条目,即刻为空!

      因为只有 2500 条记录,您可以通过 ORDER BY RAND() LIMIT 1 获取随机行。当您有更多记录时,我不建议这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-26
        • 2016-04-04
        • 2019-01-11
        • 2015-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多