MYSQL:如果行值相同,如何设置为相同的位置?

时间:2012-04-19 14:42:08

标签: php mysql

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 个答案:

答案 0 :(得分:2)

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

UPDATE `table` t SET position = (
    SELECT MIN(position) FROM (SELECT * FROM `table`) t2 WHERE t.Average = t2.Average AND t.gpmp = t2.gpmp
)

答案 1 :(得分:1)

(伪代码) 从表中选择* 获取输出到php var
foreach(php行数据)
行是否等于前一行?
是 - 不增加行计数器,增加重复计数器
no - 使用重复次数增加行计数器并重置重复计数器
将当前行保存为“上一行”
下一个

答案 2 :(得分: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)

答案 3 :(得分: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++;
}

你只需要“扩展”这个想法,也可以考虑到帐户。