2012-04-19 202 views
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  

枝所有,MYSQL:如果行值相同,如何设置为相同位置?

文中的表,我需要按最低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  
+1

自己试过什么?如果是这样,在这里发布 – xbonez 2012-04-19 14:51:58

回答

1

(伪代码) SELECT * FROM表
获取输出到PHP变种
的foreach(数据PHP行)
是行等于前一行?
是 - 不增加行计数器,增量副本计数器
无 - 有重复的#递增行计数器和重置副本计数器
保存当前行“上一行”
未来

+0

对于伪代码 – fancyPants 2012-04-19 15:00:14

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

您只需要“扩大”的想法,以采取帐户也averange。

2

这里有一个简单的方法来更新表格,就像你在文章中描述的那样 - 采取连续的位置并相应地更新它们。它不计算位置或任何东西,只是使用已经存在的数据:

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

+1,但得到一个错误,指出'您无法在FROM子句中指定目标表't'进行更新。但即时通讯工作的错误 – sharpteethcat 2012-04-19 16:00:39

+0

不好意思回合。更新我的答案,使用子选择来解决MySQL问题。 – 2012-04-19 17:03:28

+0

谢谢..它现在完美的作品。 :) – sharpteethcat 2012-04-19 17:26:25

相关问题