1
position    | Average |   gpmp

1             70.60         2.0     
2             60.20         2.3    
3             59.80         4.8    
4             59.80         4.8     
5             45.70         5.6     

大家好,

如上表,我需要按照最低gpmp和最高平均值来排列位置。但是当平均值和 gmp 相同时,我需要有相同的位置。

例如,位置 3 和 4 具有相同的平均值和 gpmp。如何生成 mysql 查询或使用 php 函数,以便在他们检测到相同的平均值和 gpmp 并将位置 4 更改为 3 之后。

这意味着生成函数后,它将如下表所示。

position    | Average |   gpmp

1             70.60         2.0     
2             60.20         2.3    
3             59.80         4.8    
3             59.80         4.8     
5             45.70         5.6    
4

4 回答 4

2

这是您在帖子中描述的更新表格的简单方法 - 获取顺序位置并相应地更新它们。它不计算位置或任何东西,只是使用已经存在的数据:

UPDATE `table` t SET position = (
    SELECT MIN(position) FROM (SELECT * FROM `table`) t2 WHERE t.Average = t2.Average AND t.gpmp = t2.gpmp
)
于 2012-04-19T14:57:38.873 回答
1

(伪代码) select * from table
get output into php var
foreach (php 数据行)
是行等于前一行吗?
是 - 不增加行计数器,增加重复计数器
no - 用重复数增加行计数器并重置重复计数器
将当前行保存为“上一行”
下一个

于 2012-04-19T14:55:32.857 回答
1

我会尝试以下类似的方法,因为它确实假设此表上有一个主键。如果没有主键,您将在轻松更新特定行时遇到问题/您将有很多重复项。

所以对于这个例子,我假设表格如下

someTable (
    pkID (Primary Key),
    position,
    Average,
    gpm
)

所以下面的 INSERT 会做我期望的工作

INSERT INTO someTable (
    pkID,
    position
)
SELECT
    someTable.pkID,
    calcTable.position
FROM someTable
INNER JOIN (
    SELECT 
        MIN(c.position) AS position,
        c.Average,
        c.gpm
    FROM (
        // Calculate the position for each Average/gpm combination
        SELECT
            @p = @p + 1 AS position,
            someTable.Average,
            someTable.gpm
        FROM (
            SELECT @p:=0
        ) v,someTable
        ORDER BY 
            someTable.Average DESC, 
            someTable.gpmp ASC
    ) c
    // Now regroup to get 1 position for each combination (the lowest position)
    GROUP BY c.Average,c.gpm
) AS calcTable

// And then join this calculated table back onto the original
ON (calcTable.Average,calcTable.gpm) = (someTable.Average,someTable.gpm)

// And rely on the PK IDs clashing to allow update
ON DUPLICATE KEY UPDATE position = VALUES(position)
于 2012-04-19T14:55:43.883 回答
0

你可以在php中尝试这样的事情:

$d= mysql_query('select distinct gpmp from tablename order by gpmp');

pos= 1;

while($r= mysql_fetch_array($d)){

   mysql_query('update tablename set position='.$pos.' where gpmp='.$r['gpmp']);

   $pos++;
}

你只需要“扩展”这个想法来考虑平均。

于 2012-04-19T14:56:38.860 回答