2012-04-19 113 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

相關問題