0

私は4つの異なるテーブルを持っています:

  1. コンテスト
  2. 物体
  3. Contest_Obj
  4. 勝利

CONTEST には多くのオブジェクト (contest_obj を介して) と賞金があります。コンテストには開始日と終了日が含まれます。

OBJECT には多くのコンテストがあります (contest_obj を介して)

CONTEST_OBJ には、object_id、contest_id、票が含まれます (コンテストの終了日以降のほとんどの票が勝者となります)

WINNING には、contest_id、amount、および amount_type (ドルとユーロ) があります。


できるだけ少ない SQL 呼び出しでこのデータにアクセスできるようにしたいと考えています。具体的には、現在コンテストの勝者を保存していないため、その場で計算しています。

次の SQL の記述を手伝ってもらいたいと思っていました。

  1. total_owned_dollars (過去のコンテストで獲得した合計金額を返します)
  2. total_wining_euros (過去のコンテストで獲得した合計ドルを返します)
  3. all_won_contests (オブジェクトが勝者であるすべてのコンテストと、そのコンテストの賞金をドルとユーロの両方で返す)

コンテストの勝者を決定するために必要なコード:

SELECT "objects".* 
     FROM "objects" 
     INNER JOIN "contest_objs" ON "objects"."id" = "contest_objs"."object_id" 
     WHERE "contest_objs"."contest_id" = ? 
     ORDER BY votes DESC 
     LIMIT 1

サンプル テーブル データ:

CREATE TABLE `contests` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`start_date` DATETIME,
`end_date`  DATETIME,
`user_id`  INT,
`title` STRING
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `objects` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` STRING
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `winnings` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`contest_id` INT NOT NULL,
`comment` TEXT,
`amount_type` STRING NOT NULL,
`amount` INT NOT NULL,
`user_id`  DATETIME 
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `contest_objs` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`contest_id` INT NOT NULL,
`object_id` INT NOT NULL,
`votes` INT 
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

INSERT INTO `objects` VALUES
(1, "Foo"),
(2, "Bar")

INSERT INTO `contests` VALUES
(1, "2012-09-16 23:30:16.220991", "2012-09-17 23:30:16.220991", 1, "Contest X"),
(2, "2012-09-17 23:30:16.220991", "2016-09-17 23:30:16.220991", 2, "Contest Y")

INSERT INTO `winnings` VALUES
(1, 1, "Giving $5", 5, "dollars", 1),
(2, 1, "Giving 2 euros", 2, "euros", 1),
(3, 1, "Giving 4 euros", 4, "euros", 2),
(4, 2, "Giving 2 euros to different contest", 2, "euros", 1)

INSERT INTO `contest_objs` VALUES
(1, 1, 1, 10),
(2, 1, 2, 12),
(3, 2, 2, 0),
(4, 2, 2, 0)

上記の例では:

Contest X (over) には 2 つのオブジェクト (foo と bar) があります。バーはコンテスト X で 12 票を得て優勝しました。Bar はこのコンテストで合計 $5 ドルと 6 ユーロを獲得しました。

4

0 に答える 0