MySQL根据另一个字段的顺序将值应用于每行的字段

时间:2011-10-02 12:12:56

标签: php mysql database arrays

我有一张表,我想为每条记录应用价格等级。

1为最高,2为下一个最高,3为下一个最高。

目前我正在选择每一行,然后单独更新每条记录:

用法:函数get_list('table','order field','order direction') - 返回关联数组

foreach(get_list('ps2','price','DESC') as $p)
{
    $ct++;
    $s = "UPDATE `ps2` 
            SET `price_rank` = '".$ct."' 
            WHERE `db_id` = '".$p[db_id]."'
            LIMIT 1";
    mysql_query($s);
}

由于我有很多记录,这是非常缓慢的,还有另一种方式吗?

编辑: 这是一种方式更快,但有更好的方法吗?

ALTER TABLE `ps2` DROP `price_rank` ;
ALTER TABLE `ps2` CHANGE `db_id` `db_id` INT( 11 ) NOT NULL ;
ALTER TABLE `ps2` DROP PRIMARY KEY ;
ALTER TABLE `ps2` ORDER BY `price_per_pax_after_tax` DESC;
ALTER TABLE `ps2` ADD `price_rank` INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
ALTER TABLE `ps2` ORDER BY `db_id`;
ALTER TABLE `ps2` CHANGE `price_rank` `price_rank` INT( 11 ) NOT NULL ;
ALTER TABLE `ps2` DROP PRIMARY KEY ;
ALTER TABLE `ps2` ADD PRIMARY KEY ( `db_id` ) ;
ALTER TABLE `ps2` CHANGE `db_id` `db_id` INT( 11 ) NOT NULL AUTO_INCREMENT ;

1 个答案:

答案 0 :(得分:1)

就个人而言,我会使用MAX等函数和limit和offset来处理DML语句中的排名,以获得我想要的结果。 此外,当价格发生变化时,如果将它们存储在表格中,则必须重新填充排名值。 上面的当前方法不能处理相同的价格。

您可以在不使用此

存储的情况下返回排名
SELECT p.db_id, COUNT(DISTINCT p2.price) as Rank 
FROM packages_sorted as p 
JOIN packages_sorted as p2 ON p.price <= p2.price 
GROUP BY p.db_id 

如果您仍想存储排名,

UPDATE FROM packages_sorted as p JOIN (
    SELECT p.db_id, COUNT(DISTINCT p2.price) as PriceRank 
    FROM packages_sorted as p 
    JOIN packages_sorted as p2 ON p.price <= p2.price 
    GROUP BY p.db_id
) as pSub ON p.db_id = pSub.db_id 
SET p.price_rank = pSub.PriceRank 

这两个语句都处理具有不同计数的identicle价格。