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

(의사 코드) 은 PHP의 VAR로
의 foreach (PHP 데이터 열)를 출력을 얻을 테이블
* FROM
은 행은 이전 행 같다?
예 - 행 카운터, 증가 중복 카운터
전혀 증가하지 않습니다 - 중복 #으로 증가 행 카운터 및 '이전 행'등의 현재 행에 저장 중복 카운터
를 재설정하는
다음

+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

에 시도했지만 'FROM 절에서 업데이트 할 대상 테이블't '을 (를) 지정할 수 없습니다.'라는 오류가 표시됩니다. 하지만 오류 – sharpteethcat

+0

일하고있어 미안해. 해당 MySQL 문제를 해결하기 위해 하위 선택을 사용하여 내 대답이 업데이트되었습니다. –

+0

고마워. 지금 완벽하게 작동하고있어. :) – sharpteethcat

관련 문제