在评级中分配位置(MySQL、PHP)
我有一个MySQL数据库,包含以下列:在评级中分配位置(MySQL、PHP),php,mysql,rating,Php,Mysql,Rating,我有一个MySQL数据库,包含以下列: id company rating_score rating_place 我有公司和每个公司的评级分数。因此,我的db看起来像: id company rating_score rating_place 75 Intel 356.23 34 Sun 287.49 etc. 如何使用php和mysql根据分数分配位置(我的ra
id company rating_score rating_place
我有公司和每个公司的评级分数。因此,我的db看起来像:
id company rating_score rating_place
75 Intel 356.23
34 Sun 287.49
etc.
如何使用php和mysql根据分数分配位置(我的rating_place列为空)
谢谢大家! 我将使用order by desc子句进行选择,然后用评级更新每一行。我将使用order by desc子句进行选择,然后用评级更新每一行。
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);
}
这个怎么样:
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);
}
当你去的时候,可能会更方便地找到那个地方。要做到这一点,您需要通过评分(ASC)读取值和顺序。然后,当你读出它们时,它们会按顺序排列。如果愿意,可以将其写回表中,但这意味着您必须不断更新place值。如果这个数据库由于用户输入或其他原因而不断变化,我建议您边走边计算位置。如果表基本上保持静态,则可以有一个place列。在运行时计算出位置可能更方便。要做到这一点,您需要通过评分(ASC)读取值和顺序。然后,当你读出它们时,它们会按顺序排列。如果愿意,可以将其写回表中,但这意味着您必须不断更新place值。如果这个数据库由于用户输入或其他原因而不断变化,我建议您边走边计算位置。如果表大部分保持静态,则可以有一个place列。如果您只是尝试按最高评级排序到最低评级,请在SQL查询的末尾添加以下内容:
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)
如果您只是尝试按最高评级排序到最低评级,请将此添加到SQL查询的末尾:
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)
虽然Andrew G.Johnson是正确的,但您甚至可能不需要将此信息存储在数据库中 我给你的答案很简单:“为什么要将其存储在数据库中?” 如果您确实有一个很好的理由,那么您可以根据数据的静态程度进行一些选择。如果创建了数据,然后一次插入所有数据,则语句末尾的“按评级排序得分说明”应执行此操作(如果评级位置从1自动指定) 否则,我会在一个专门的PHP页面中做一些事情,一旦你的2列被读取,就会分配评级位置。如果您手动将数据输入数据库,那么打开页面应该不会有什么坏处。如果数据收集是自动化的,那么继续并调用更新评级的“update_places_页面” 编辑:
另一个选项是创建一个评分视图,将排名前20位的订单重新排序,然后根据评分从新视图和实际表格中进行选择。虽然Andrew G.Johnson是正确的,但您甚至可能不需要将此信息存储在数据库中 我给你的答案很简单:“为什么要将其存储在数据库中?” 如果您确实有一个很好的理由,那么您可以根据数据的静态程度进行一些选择。如果创建了数据,然后一次插入所有数据,则语句末尾的“按评级排序得分说明”应执行此操作(如果评级位置从1自动指定) 否则,我会在一个专门的PHP页面中做一些事情,一旦你的2列被读取,就会分配评级位置。如果您手动将数据输入数据库,那么打开页面应该不会有什么坏处。如果数据收集是自动化的,那么继续并调用更新评级的“update_places_页面” 编辑:
另一个选项是创建一个评分视图,该视图将排名前20的订单重新排序,然后根据评分从新视图和实际表格中进行选择。只需按评分排序!这种方法是错误的,因为如果您插入了某些内容,您将不得不移动并修改高于某个级别的所有数据。糟糕的数据结构 如果你一年只插入一到两次,你可能会说整数排序更快,但这只是一个极小的区别,因为排序是基于树索引的,而不是基于比较的 所以我见过像安德鲁·G·约翰逊这样的解决方案。您还可以进一步调整,只更新分数更高的条目。 您还可以创建一个触发器,自动为您执行此操作 但让我解释一下为什么这是错误的: 它的冗余数据。它不是原子的和一致的。 在一个好的数据库设计中,您应该总是(如果可能的话)只在一个点上存储每个信息,这样就可以以原子的方式修改、删除这些信息。 因此,您可以首先避免任何不一致性和复杂性。 如果您真的不想“缓存”排名,请在应用程序中执行该操作 那么,如果您真的希望像这样调用数据库字段,那么有什么替代方案呢 基于已排序的查询创建一个查询。 如果这是你的目标,你也可以在那里做缓存 但是缓存的更好选择是让