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

答えて

1

は(擬似コード) テーブル
SELECT * FROM PHP VAR
foreachの(データのPHP行)
に出力を取得する前の行と同じ行でありますか?私は与えるだろうインクリメント行カウンタ重複の#とと「前の行」として複製カウンタを現在の行の保存
をリセット

+0

+1疑似コード – fancyPants

1

から
ない はい - 行カウンタをインクリメントしていない、増分重複カウンタ
なし次のようなものがあります。主キーがこのテーブルにあると仮定します。主キーがなければ、特定の行を簡単に更新する問題が発生するでしょう。多くの重複があります。

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

を次のように

は、したがって、この例のために私は、したがって、次のINSERTは、私はあなたが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) 
0

を期待して仕事をするだろうテーブルがあると仮定します。

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

アジャンギャンを考慮に入れるだけでよいのです。

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

が試みられましたが、 'ターゲットテーブル' t 'をFROM句の更新に指定できません'というエラーが表示されました。しかし、エラーに取り組んで – sharpteethcat

+0

すみません。 MySQLの問題を回避するためにサブ選択を使用するように私の答えを更新しました。 –

+0

ありがとうございます。 :) – sharpteethcat