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  

Hie Все,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 вар
Еогеасп (PHP строки данных)
является строка равна предыдущей строке?
да - не увеличиваем счетчик строк, приращение счетчика дубликата
нет - приращение строки счетчика с # дублей и сброса счетчика дубликата
сохранить текущую строку как «предыдущей строки»
следующий

+0

+1 для псевдокода – fancyPants

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

Вам нужно только «развернуть» идею, чтобы принять и учетную запись.

2

Вот простой способ обновить таблицу, как вы описали в своем post, взяв последовательные позиции и соответствующим образом обновив их. Он не вычисляет позиции или что-либо еще, просто использует данные уже там:

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. но im работает над ошибкой – sharpteethcat

+0

Простите, что. Обновлен мой ответ, чтобы использовать подвыбор, чтобы обойти эту проблему MySQL. –

+0

Спасибо .. теперь он отлично работает. :) – sharpteethcat

Смежные вопросы