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     

やあみんな、

上記の表のように、最低のgpmpと最高の平均に従って位置を調整する必要があります。しかし、averageと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    
4

4 に答える 4

2

投稿で説明したようにテーブルを更新する簡単な方法は次のとおりです。順番に配置し、それに応じて更新します。位置などは計算せず、すでにそこにあるデータを使用するだけです。

UPDATE `table` t SET position = (
    SELECT MIN(position) FROM (SELECT * FROM `table`) t2 WHERE t.Average = t2.Average AND t.gpmp = t2.gpmp
)
于 2012-04-19T14:57:38.873 に答える
1

(擬似コード)select * from table
get output into php var
foreach(php row of data)
is row is equal to previous row?
はい-行カウンターをインクリメントせず、重複カウンターをインクリメントしますいいえ-重複
の数で行カウンターをインクリメントし、重複カウンターをリセットし
ます現在の行を「前の行」として保存します
次 へ

于 2012-04-19T14:55:32.857 に答える
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)
于 2012-04-19T14:55:43.883 に答える
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も考慮に入れるために、アイデアを「拡張」する必要があるだけです。

于 2012-04-19T14:56:38.860 に答える