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

Php MYSQL:如果行值相同,如何设置到相同的位置?,php,mysql,Php,Mysql,大家好 如上表所示,我需要根据最低gpmp和最高平均值来安排职位。但是当平均值和gmp值相同时,我需要有相同的位置 例如,位置3和位置4具有相同的平均值和gpmp。如何生成mysql查询或使用php函数,以便在它们检测到相同的平均值和gpmp并将位置4更改为3之后 这意味着在生成函数后,它将变成如下表所示 position | Average | gpmp 1 70.60 2.0 2 60.20

大家好

如上表所示,我需要根据最低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    
4             59.80         4.8     
5             45.70         5.6     
伪码 从表中选择* 将输出获取到php变量中 foreach php数据行 行是否等于上一行? 是-不递增行计数器,递增重复计数器 否-增加行计数器的重复数并重置重复计数器 将当前行另存为“上一行” 下一步

伪代码 从表中选择* 将输出获取到php变量中 foreach php数据行 行是否等于上一行? 是-不递增行计数器,递增重复计数器 否-增加行计数器的重复数并重置重复计数器 将当前行另存为“上一行”
下一步,我将尝试以下内容,因为它假定主键在这个表上。如果没有主键,您将很难轻松地更新特定行/您将有许多重复项

因此,对于这个例子,我假设如下表所示

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    
因此,下面的插入将完成我期望的工作

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

我想尝试一下下面这样的方法,因为它假设一个主键在这个表上。如果没有主键,您将很难轻松地更新特定行/您将有许多重复项

因此,对于这个例子,我假设如下表所示

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    
因此,下面的插入将完成我期望的工作

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

您可以在php中尝试以下内容:

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)

您只需扩展想法,就可以考虑averange。

您可以在php中尝试以下内容:

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)

你只需要扩展这个想法就可以将平均值也考虑进去。

这里有一个简单的方法来更新表格,正如你在文章中所描述的那样——选择顺序位置并相应地更新它们。它不计算位置或任何东西,只使用已经存在的数据:

$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++;
}

这里有一个简单的方法来更新表,正如你在文章中所描述的那样——获取顺序位置并相应地更新它们。它不计算位置或任何东西,只使用已经存在的数据:

$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++;
}

你自己试过什么吗?如果是的话,把它贴在这里,你自己试过什么吗?如果是这样,请将其发布到此处,但出现一个错误,说明“您不能在FROM子句中为update指定目标表“t”。但是我正在处理这个错误,对此我很抱歉。更新了我的答案,以使用子选择来解决该MySQL问题。尝试过,但出现一个错误,声明“无法在FROM子句中为update指定目标表“t”。但是我正在处理这个错误,对此我很抱歉。更新了我的答案,使用子选择来解决MySQL问题。