mysql 将sql中的列递增到45,然后从1重新开始

2ledvvac  于 2022-12-17  发布在  Mysql
关注(0)|答案(1)|浏览(138)

此功能不工作良好:

$st = $dbh->query("SELECT * from player.player_gift");
    $test = $st->fetchAll();

    if(isset($_POST['pregatit'])) {

        foreach($test as $test2) {

            if(!is_null($test2['owner_id'])) {
                $st = $dbh->prepare('UPDATE player.player_gift SET pos = ? WHERE owner_id = ?');
                $st->execute([getRandomPositionFor($test2['owner_id']), $test2['owner_id']]);
            } else {
                // wh_log('id ul' . $test2['owner_id'] . 'a dat eroare');
            }
        }

        die();
    }

function getRandomPositionFor($ownerid) {
        static $lastposinserted = 0;
        static $lastownerid = -1;
        $lastownerid = $ownerid;

        if($lastownerid != $ownerid) 
            $lastposinserted = 0;

        if($lastposinserted > 60)
            $lastposinserted = 0;

        $lastposinserted++;

        return $lastposinserted;
    }

这一个是从数据库中创建列,如下所示:
| 所有者标识|位置|
| - ------|- ------|
| 二十万四千四百一十二人|十九|
| 二十万四千四百一十二人|十九|
| 二十万四千四百一十二人|十九|
| 小行星204405|二十四|
| 小行星204405|二十四|
| 小行星204405|二十四|
| 小行星204405|二十四|
| 小行星20439|四十八|
| 小行星204390|四十八|
| 小行星204390|四十八|
我希望他们是这样的:
| 所有者标识|位置|
| - ------|- ------|
| 二十万四千四百一十二人|1个|
| 二十万四千四百一十二人|第二章|
| 二十万四千四百一十二人|三个|
| 小行星204405| 1个|
| 小行星204405|第二章|
| 小行星204405|三个|
| 小行星204405|四个|
| 小行星204390| 1个|
| 小行星204390|第二章|
| 小行星204390|三个|
并且如果pos大于60则返回到1

kh212irz

kh212irz1#

在MySQL 8.x中,您可以使用ROW_NUMBER()
如果行必须具有固定顺序,则需要添加一个列以对行进行排序

UPDATE player.player_gift 
SET pos = ROW_NUMBER() OVER(PARTITION BY owner_id ORDER BY RAND())

你正在丢失一个主键,所以你需要添加一个,如果你想所有的作品propöy
一个一个二个一个一个一个二个一个一个一个三个一个一个一个一个一个一个一个一个四个一个一个一个一个一个一个一个一个一个一个
| 所有者标识|位置|
| - ------|- ------|
| 二十万四千四百一十二人|1个|
| 二十万四千四百一十二人|第二章|
| 二十万四千四百一十二人|三个|
| 小行星204405| 1个|
| 小行星204405|第二章|
| 小行星204405|三个|
| 小行星204405|四个|
| 小行星204390| 1个|
| 小行星204390|第二章|
| 小行星204390|三个|
fiddle

相关问题