1

我有一个包含以下列的 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 列为空)?

谢谢!

4

7 回答 7

5

虽然 Andrew G. Johnson 是正确的,但您甚至可能不需要将此信息存储在数据库中。

我给你的答案很简单:“你为什么要将它存储在数据库中?”

如果您确实有充分的理由,那么您可以根据数据的静态程度做出一些选择。如果创建了数据然后一次全部插入,那么ORDER BY rating_score DESC在语句的末尾应该这样做(如果 rating_place 从 1 自动分配)。

否则,我会在一个专门的 PHP 页面中做一些事情,一旦你的 2 列被读取,就会分配 rating_place。如果您手动将数据输入数据库,则不必打开页面。如果数据收集是自动化的,请继续调用更新评级的“update_places_page”。

编辑:

另一种选择是为 rating_score 创建一个视图,该视图采用前 20 名并订单重新排序它们,然后从新视图和基于 rating_score 的实际表中进行选择。

于 2009-11-22T08:26:44.937 回答
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)
于 2009-11-21T22:02:06.117 回答
0

这个怎么样:

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

----编辑(评论后)aww抱歉,你不能从你在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);
}
于 2009-11-21T21:32:17.340 回答
0

只需按评分排序!这种方法是错误的,因为如果你插入一些东西,你将不得不改变所有高于某个等级的数据。数据结构不好。

好吧,如果您一年只插入一次或两次,您可能会争辩说整数排序更快,但这只是一个非常小的差异,因为排序是基于树索引而不是比较。

所以我看到了像 Andrew G. Johnson's 这样的解决方案。您还可以进一步调整它,只更新分数更高的条目。您还可以创建一个自动为您执行此操作的触发器。

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

它的冗余数据。它不是原子的和一致的。在一个好的数据库设计中,您应该始终(如果可能)只在一个点存储每个信息,以便可以以原子方式对其进行修改、删除。因此,您可以首先避免任何不一致和并发症。如果您真的不想“缓存”排名,请在您的应用程序中进行

那么,如果你真的想要这样调用数据库字段,你有什么替代方法呢?

根据排序查询创建一个mysql 视图。如果那是你的目标,你也可以在那里缓存 AFAIK。

但更好的缓存选择是让 mysql 查询缓存为您完成工作。那将是最好的选择。

我看不出有什么理由去做你想做的事,只有反对它的有效论据。

于 2010-10-31T14:43:18.047 回答
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;');
于 2010-11-03T09:30:04.610 回答
-1

我会使用 order by desc 子句进行选择,然后使用评级更新每一行。

于 2009-11-21T21:22:53.803 回答
-2

边走边算可能要方便得多。为此,您将按 Rating_Score (ASC) 读取值和顺序。然后,当您读出它们时,它们将按顺序排列。如果您愿意,您可以将其写回表中,但这意味着您必须不断更新位置值。如果这个数据库会不断地从用户输入或其他东西中改变,我建议你在去的时候找出这些地方。如果表格大部分保持静态,则可以有一个 place 列。

于 2009-11-21T21:53:02.147 回答