我有一张表,我想为每条记录应用价格等级。
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 ;
答案 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价格。