Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在评级中分配位置(MySQL、PHP)_Php_Mysql_Rating - Fatal编程技术网

在评级中分配位置(MySQL、PHP)

在评级中分配位置(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

我有一个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根据分数分配位置(我的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·约翰逊这样的解决方案。您还可以进一步调整,只更新分数更高的条目。 您还可以创建一个触发器,自动为您执行此操作

但让我解释一下为什么这是错误的:

它的冗余数据。它不是原子的和一致的。 在一个好的数据库设计中,您应该总是(如果可能的话)只在一个点上存储每个信息,这样就可以以原子的方式修改、删除这些信息。 因此,您可以首先避免任何不一致性和复杂性。 如果您真的不想“缓存”排名,请在应用程序中执行该操作

那么,如果您真的希望像这样调用数据库字段,那么有什么替代方案呢

基于已排序的查询创建一个查询。 如果这是你的目标,你也可以在那里做缓存

但是缓存的更好选择是让