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