私は4つの異なるテーブルを持っています:
- コンテスト
- 物体
- Contest_Obj
- 勝利
CONTEST には多くのオブジェクト (contest_obj を介して) と賞金があります。コンテストには開始日と終了日が含まれます。
OBJECT には多くのコンテストがあります (contest_obj を介して)
CONTEST_OBJ には、object_id、contest_id、票が含まれます (コンテストの終了日以降のほとんどの票が勝者となります)
WINNING には、contest_id、amount、および amount_type (ドルとユーロ) があります。
できるだけ少ない SQL 呼び出しでこのデータにアクセスできるようにしたいと考えています。具体的には、現在コンテストの勝者を保存していないため、その場で計算しています。
次の SQL の記述を手伝ってもらいたいと思っていました。
- total_owned_dollars (過去のコンテストで獲得した合計金額を返します)
- total_wining_euros (過去のコンテストで獲得した合計ドルを返します)
- 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 ユーロを獲得しました。