2

私はphpとsqlが初めてで、後者についてもう少し学ぶために小さなゲームを構築しています。

これは、3 つのテーブルからなる単純なデータベースです。

 -- *********** SIMPLE MONSTERS DATABASE

 CREATE TABLE  monsters (

 monster_id         VARCHAR(20),
 haunt_spawn_point  VARCHAR(5)  NOT NULL,
 monster_name       VARCHAR(30) NOT NULL,
 level_str          VARCHAR(10) NOT NULL,
 creation_date      DATE NOT NULL,

 CONSTRAINT monster_id_pk PRIMARY KEY (monster_id)
 );

 -- ****************************************

 CREATE TABLE  spawntypes (

 spawn_point            VARCHAR(5),
 special_tresures       VARCHAR (5) NOT NULL,
 maximum_monsters       NUMBER NOT NULL,
 unitary_experience     NUMBER NOT NULL,

 CONSTRAINT spawn_point_pk PRIMARY KEY (spawn_point)
 );

 -- ****************************************

 CREATE TABLE  fights (

 fight_id           NUMBER,
 my_monster_id      VARCHAR(20),
 foe_spawn_point    VARCHAR(5),
 foe_monster_id     VARCHAR(20) NOT NULL,
 fight_start        TIMESTAMP NOT NULL,
 fight_end          TIMESTAMP NOT NULL,
 total_experience   NUMBER NOT NULL
 loot_type          NUMBER NOT NULL,

 CONSTRAINT my_monster_id_fk FOREIGN KEY (my_monster_id)
 REFERENCES monsters (monster_id),

 CONSTRAINT foe_spawn_point_fk FOREIGN KEY (foe_spawn_point)
 REFERENCES spawntypes (spawn_point),

 CONSTRAINT fight_id_pk PRIMARY KEY (fight_id)
 );

このデータが与えられた場合、この 2 つのタスクを簡単に実行するにはどうすればよいでしょうか。

1) ファイト ID のみをパラメーターとして渡し、foe_spawn_point (ファイト テーブル内) を指定すると、spawntypes テーブルを参照するこのスポーン ポイントに関連する unitary_experience を返す pl/sql 関数を作成したいと思います。 ? :-/ [f(x)]

戦闘から獲得した合計経験値 (unitary_experience * fight_length) を計算するために、特定の戦闘で、fight_end を fight_start で減算する関数を作成したので、戦闘がどれくらい続いたかがわかります。[f(y)]

2) データベース作成タスク中に、この 2 つの関数を使用する (それらが返す結果を乗算する) ことは可能ですか?

INSERT INTO と戦う VALUES(.... , f(x) * f(y), '戦利品 A');

ファイト テーブル内のすべての total_experience エントリを設定するには?

ご協力ありがとうございました

4

1 に答える 1

1

SQL では、通常、関数を作成して何かを行うことについては話しません。SQL の構成要素は、クエリ、ビュー、およびストアド プロシージャです (ほとんどの SQL ダイアレクトには関数がありますが、そこから始めることはできません)。

したがって、$FIGHTID を持つ変数を指定すると、次のjoin操作を使用する単純なクエリでユニタリ エクスペリエンスを取得できます。

select unitary_experience
from fight f join
     spawnTypes st
     on st.spawn_point = f.foe_spawn_point
where fightid = $FIGHTID

関数とともに一連の値を挿入する場合は、次のselect形式を使用することをお勧めしinsertます。

insert into fights(<list of columns, total_experience)
    select <list of values>,
           ($FIGHT_END - $FIGHT_START) * (select unitary_experience from spawnTypes where spawnType ='$SPAWN_POINT)

テーブルに関する 1 つのコメント。テーブル内のすべての ID を自動インクリメントされる整数にすることをお勧めします。Oracle では、シーケンスを作成することでこれを行います (他のほとんどのデータベースではより簡単です)。

于 2013-03-02T21:17:12.117 に答える