我有一个表,我想为每个记录应用一个价格等级。
1表示最高,2表示次高,3表示次高。
目前,我选择每一行,然后逐个更新每条记录,如下所示:
用法: function get_list(‘表’,‘顺序字段’,‘顺序方向’)-返回关联数组
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 ;发布于 2011-10-02 22:09:51
就我个人而言,我会使用像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 这两个语句都使用count distinct来处理标识价格。
https://stackoverflow.com/questions/7626231
复制相似问题