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」への呼び出しをスローします。

編集:

もう1つのオプションは、上位20を取得して注文を並べ替えるrating_scoreのビューを作成し、新しいビューと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)

----編集(コメント後)申し訳ありませんが、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
SELECT @row := 0;
UPDATE
    `table`
SET
    `table`.`rating_place` = (@row := @row +1)
ORDER BY
    `table`.`rating_score` DESC;

PS: PHP からクエリを送信する場合は、2 つを分割する必要があります。これは、PHP MySQL 拡張機能では通常、呼び出しごとに 1 つのクエリしか許可されないためです。

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 に答える
0

評価順に並べるだけ!何かを挿入すると、特定のランクを超えるすべてのデータをシフト変更する必要があるため、このアプローチは間違っています。データ構造が正しくありません。

年に 1 回か 2 回だけ何かを挿入する場合、整数の並べ替えの方が高速であると主張できますが、並べ替えは比較ではなくツリー インデックスに基づいているため、それはごくわずかな違いにすぎません。

したがって、アンドリュー G. ジョンソンのようなソリューションを見てきました。これをさらに微調整して、より高いスコアのエントリのみを更新することもできます。自動的に実行するトリガーを作成することもできます。

しかし、これが間違っている理由を説明しましょう。

その冗長データ。アトミックで一貫性がありません。優れたデータベース設計では、アトミックな方法で変更、削除できるように、常に (可能であれば) すべての情報を 1 つのポイントにのみ保存する必要があります。そのため、そもそも矛盾や複雑化を回避できます。ランキングを「キャッシュ」したくない場合は、アプリケーションで実行してください

データベースフィールドをこのように呼び出したい場合、これに代わるものは何ですか?

ソートされたクエリに基づいてmysql ビューを作成します。それがあなたの目標であれば、AFAIKでキャッシュを行うこともできます。

しかし、キャッシュのより良いオプションは、mysql クエリ キャッシュに作業を任せることです。それが最良の選択肢でしょう。

あなたがやろうとしていることをする理由はまったくありません。それに対する正当な議論だけです。

于 2010-10-31T14:43:18.047 に答える
-1

order by des 句を使用して選択を行い、各行を評価で更新します。

于 2009-11-21T21:22:53.803 に答える
-2

移動しながら場所を把握する方がおそらくはるかに便利です。これを行うには、値を読み取り、Rating_Score (ASC) で並べ替えます。それから、あなたがそれらを読んでいるときに、それらは順番に配置されます. 必要に応じて、これをテーブルに書き戻すこともできますが、これは場所の値を常に更新する必要があることを意味します。このデータベースがユーザー入力などから絶えず変化する場合は、場所を調べながら作業することをお勧めします。テーブルがほとんど静的なままである場合は、場所列を使用できます。

于 2009-11-21T21:53:02.147 に答える