我有以下的列的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)