-->

在评级指定的地方(MySQL和PHP)(Assign places in the rating (M

2019-10-18 09:30发布

我有以下的列的MySQL数据库:

id     company      rating_score     rating_place

我公司与评级得分为每家公司。 所以,我的数据库是这样的:

id     company      rating_score     rating_place

75     Intel         356.23          

34     Sun           287.49

etc.

我该如何分配基于使用PHP和MySQL得分的地方(我rating_place栏是空的)?

谢谢!

Answer 1:

这个怎么样:

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
    )

之后,你可以丢弃mytemptable。

但如果你想避免一个单独的表,你可以使用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);
}


Answer 2:

虽然安德鲁·约翰逊G.是正确的,你可能并不需要,甚至在数据库中存储这些信息。

我对你的回答很简单:“你要这些信息存储在数据库中,为什么呢?”

如果你实际上已经有一个很好的理由,那么你必须根据数据如何静态的几个选择。 如果数据被创建,然后插入一下子,然后ORDER BY rating_score DESC在你的语句结尾应该这样做(如果rating_place从1自动分配)。

否则,我会做一个专门的PHP页面,一旦你的两列被读取,分配rating_place东西。 如果您手动输入数据到数据库,它不应该伤害有打开的页面。 如果数据收集是自动的,继续前进,抛出调用“update_places_page”,更新评级。

编辑:

另一种选择就是创建rating_score一个观点,即取前20名和订单重新排序它们,然后从新的观点,并基于rating_score实际表中选择。



Answer 3:

如果你只是想排序最高评级最低添加到您的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)


Answer 4:

只需按评价! 这种做法是错误的,你将不得不修改转移超过一定等级的所有数据,如果你插入的东西。 糟糕的数据结构。

那么,如果你只是插入的东西一次或两次,一年你可以认为整数排序比较快,但是还有那只是作为分拣一个非常小的差异是基于树索引,而不是比较。

所以,我已经见过像安德鲁G.约翰逊的解决方案。 您还可以进一步调整这个只有用更高的分数更新条目。 您还可以创建一个触发器,它自动会为你。

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

它的冗余数据。 它不是原子和一贯的。 在良好的atabase设计,你应该总是(如果可能的话)只在一个点上存储每个信息,因此它可以被修改,以原子的方式删除。 这样就可以避免在首位任何不一致之处和并发症。 如果你真的wan't到“缓存”的排名, 做在你的应用程序

那么,什么是你的替代这一点,如果你真的想有这样调用数据库字段?

创建MySQL视图基于排序的查询。 您也可以如果那是你的目标做缓存有AFAIK。

但用于缓存的更好的选择是只是为了让MySQL查询缓存做的工作适合你。 这将是最好的选择。

我看不出有什么理由什么那么做你正在尝试做的,唯一有效的理由反对它。



Answer 5:

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;');


Answer 6:

我想先说明使用条款的顺序做一个选择,然后更新评级每一行。



Answer 7:

这可能是很多更方便的工作,离开这个地方,当您去。 要做到这一点,你会被Rating_Score(ASC)读出的值和秩序。 然后,他们将是地方为了你读出来。 如果你喜欢,你可以再写回表,但是这将意味着你必须不断更新位值。 如果该数据库是要由用户输入或东西被不断改变,我会建议制定的地方,当您去。 如果表仍将大多是静态的,你可以有一个地方列。



文章来源: Assign places in the rating (MySQL, PHP)
标签: php mysql rating