繁体   English   中英

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

[英]MySQL apply a value a field of each row based on the order of another field

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

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 ;

我个人将使用聚合函数(如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 

这两个语句都以相同的数量处理相同的价格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM