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
答案 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++;
}
你只需要“扩展”这个想法,也可以考虑到帐户。