首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL根据另一字段的顺序将值应用于每行的字段

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

Stack Overflow用户
提问于 2011-10-02 20:12:56
回答 1查看 161关注 0票数 0

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

1表示最高,2表示次高,3表示次高。

目前,我选择每一行,然后逐个更新每条记录,如下所示:

用法: function get_list(‘表’,‘顺序字段’,‘顺序方向’)-返回关联数组

代码语言:javascript
复制
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);
}

因为我有很多记录,这是非常慢的,有没有其他方法?

编辑:这里有一种更快的方法,但有没有更好的方法?

代码语言:javascript
复制
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 ;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-02 22:09:51

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

您可以返回排名,而不使用此方法存储它

代码语言:javascript
复制
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 

如果你还想存储排名,

代码语言:javascript
复制
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来处理标识价格。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7626231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档