2009-11-21 1 views
1

У меня есть базы данных MySQL со следующими столбцами:Присвоить места в рейтинге (MySQL, PHP)

id  company  rating_score  rating_place 

У меня есть компании и рейтинговые баллы для каждой компании. Итак, мой дб выглядит следующим образом:

id  company  rating_score  rating_place 

75  Intel   356.23   

34  Sun   287.49 

etc. 

Как я могу назначить места (моя колонка rating_place пуста) на основе баллов с использованием PHP и MySQL?

Спасибо!

+0

Зачем вам хранить расчетные позиции внутри таблицы в любом случае? –

+0

Мне нужны эти данные в разных местах моего сайта, включая рейтинги, информацию о компании и т. Д. Есть ли лучший способ хранить данные такого типа? – Anthony

+0

Я просто хочу отметить, что если ваша RDBMS может использовать функции окна, вы можете использовать «RANK OVER (ORDER BY rating_score DESC)» для получения ранга. Он не будет работать с MySQL, хотя :-( –

ответ

0

Как об этом:

update mytable set rating_place =(select count(*)+1 from mytable intb where intb.rating_score>mytable.rating_score) 

---- редактировать (после комментария) ЗВС извините, вы не можете выбрать из той же таблицы, что вы обновляете в MySQL, поэтому попробовать его с временная таблица:

create table mytemptable as 
    select @row := @row +1 as place, mytable.id 
     from mytable, (SELECT @row := 0) r 
     order by rating_score desc; 

, а затем просто аналогичное обновление:

update mytable set rating_place = (
    select place 
     from mytemptable 
     where mytemptable.id=mytable.id 
    ) 

после этого может отказаться от этого мотивированного.

хотя, если вы хотите, чтобы избежать отдельную таблицу, и вы можете использовать PHP, вы можете попробовать

$res=mysql_query("select id from mytable order by rating_score desc"); 
$ratings=array(); 
while ($r=mysql_fetch_assoc($res)) { 
    $ratings[]=$r['id']; 
} 
foreach ($ratings as $key=>$val) { 
    mysql_query("update mytable set rating_score=".($key+1)." where id=".$val); 
} 
+0

Я получаю сообщение об ошибке: «Вы не можете указать целевую таблицу« моя таблица »для обновления в предложении FROM» :( – Anthony

+0

ха-ха, как у этого есть минус голосов, но по-прежнему отмечены как Ответ –

-1

Я бы сделал выбор по порядку по предложению desc, а затем обновил каждую строку с рейтингом.

-2

Это, вероятно, гораздо более удобным для работы вне места, как вы идете. Для этого вы должны прочитать значения и порядок по рейтингу__Score (ASC). Тогда они будут в порядке места, когда вы их прочитаете. Если хотите, вы можете записать это обратно в таблицу, но это будет означать, что вы должны постоянно обновлять значение места. Если эта база данных будет постоянно меняться с пользовательского ввода или что-то еще, я бы рекомендовал разрабатывать эти места по мере вашего продвижения. Если таблица останется в основном статической, вы можете иметь столбец места.

3

Если вы просто пытаетесь сортировать по самый высокий рейтинг низкий добавить это до конца вашего запроса:

ORDER BY rating_score DESC 

Или низшего к высшему:

ORDER BY rating_score ASC 

Если вы все еще хотите сделать это ваш способ [который я посоветовал]]:

UPDATE mytable SET rating_place=(SELECT COUNT(*)+1 FROM mytable tablecheck WHERE tablecheck.rating_score > mytable.rating_score) 
5

Хотя Андрей Дж. Джонсон прав, вы не можете чтобы хранить эту информацию в базе данных.

Ответ, который у меня для вас прост: «Почему вы хотите сохранить это в базе данных?»

Если у вас действительно есть веская причина, у вас есть несколько вариантов, основанных на том, насколько статичны данные. Если данные создаются, а затем вставляются все сразу, то ORDER BY rating_score DESC в конце вашего заявления должен это сделать (если rating_place назначается автоматически из 1).

В противном случае я бы сделал что-то на специальной странице PHP, которая после чтения двух столбцов назначает rating_place.Если вы вручную вводите данные в свою базу данных, это не должно помешать открыть страницу. Если сбор данных автоматизирован, перейдите и вызовите страницу «update_places_page», которая обновляет рейтинг.

Edit:

Другой вариант, это просто создать представление для rating_score, который принимает топ-20 и приказывает переупорядочивает их, а затем выбрать из нового вида и фактической таблицы на основе rating_score.

+0

Я полностью согласен с Джо. Хранение ранга против первой нормальной формы (1NF), потому что она не является постоянной во времени. –

0

Просто отсортируйся по рейтингу! Этот подход просто неверен, так как вам придется сдвигать изменения всех данных выше определенного ранга, если вы что-то вставляете. Плохая структура данных.

Ну, если вы только что-то вставляете что-то один или два раза в год, вы можете утверждать, что целая сортировка выполняется быстрее, но это очень просто, поскольку сортировка основана на индексах дерева, а не на сравнении.

Итак, я видел решения, подобные Andrew G. Johnson's. Вы также можете настроить это и обновить записи с более высокой оценкой. Вы также можете создать триггер, который сделает это автоматически для вас.

Но позвольте мне объяснить, почему это не так:

Своих избыточных данных. Его не атомный и согласованный. В хорошем дизайне atabase вы всегда должны (если возможно) хранить каждую информацию только в одной точке, чтобы ее можно было модифицировать, удалить атомарным способом. Таким образом, вы можете избежать любых несоответствий и осложнений в первую очередь. Если вы действительно хотите «кешировать» рейтинг, сделайте это в своем приложении.

Итак, каковы ваши альтернативы этому, если вы действительно хотите, чтобы поля базы данных назывались так?

Создайте mysql view на основе отсортированного запроса. Вы также можете сделать кеширование там AFAIK, если это ваша цель.

Но лучшим вариантом для кэширования было бы просто позволить кешу запросов mysql выполнить эту работу за вас. Это был бы самый лучший вариант.

Я не вижу причин, почему так делать то, что вы пытаетесь сделать, только действительные аргументы против него.

0
SELECT @row := 0; 
UPDATE 
    `table` 
SET 
    `table`.`rating_place` = (@row := @row +1) 
ORDER BY 
    `table`.`rating_score` DESC; 

PS: Если вы будете отправлять запросы из PHP, вам нужно будет разделить эти два, так как расширение PHP MySQL обычно допускает только один запрос за звонок.

yourQueryFunc('SELECT @row := 0;'); 
yourQueryFunc(' 
    SELECT @row := 0; 
    UPDATE 
     `table` 
    SET 
     `table`.`rating_place` = (@row := @row +1) 
    ORDER BY 
     `table`.`rating_score` DESC;');