0

_

こんにちは、みんな!

私はテーブルを持っています

CREATE TABLE `labels` (
  `id` INT NULL AUTO_INCREMENT DEFAULT NULL,
  `name` VARCHAR(250) NULL DEFAULT NULL,
  `score` INT NULL DEFAULT NULL,
  `before_score` INT NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
);

そして、私はこのテーブルを持っています

CREATE TABLE `scores` (
  `id` INT NULL AUTO_INCREMENT DEFAULT NULL,
  `name_id` INT NULL DEFAULT NULL,
  `score` INT NULL DEFAULT NULL,
  `date` DATETIME DEFAULT NULL,
  PRIMARY KEY (`id`)
);

そして、 labels.score-scores.dateでソートされた最後のscores.scoreの値と、scores.dateでソートされた最後から2番目のscores.scoreの値を持つlabels.before_scoreの結果が必要です。これはMysqlslqでのみ実行できますか?

ありがとう。

追加

たとえば、私は最初のテーブルにこのデータを持っています:

INSERT INTO `labels` (id, name, score, before_score) VALUES (1, 'John', 200, 123);
INSERT INTO `labels` (id, name, score, before_score) VALUES (2, 'Eddie', 2000, 2000);
INSERT INTO `labels` (id, name, score, before_score) VALUES (3, 'Bob', 400, 3101);

そして2番目のテーブル

INSERT INTO `scores` (`id`,`name_id`,`score`,`date`) VALUES ('1','1','12','2013-07-10');
INSERT INTO `scores` (`id`,`name_id`,`score`,`date`) VALUES ('2','2','2000','2013-05-04');
INSERT INTO `scores` (`id`,`name_id`,`score`,`date`) VALUES ('3','3','654','2012-09-12');
INSERT INTO `scores` (`id`,`name_id`,`score`,`date`) VALUES ('4','1','123','2013-12-17');
INSERT INTO `scores` (`id`,`name_id`,`score`,`date`) VALUES ('5','1','200','2014-04-25');
INSERT INTO `scores` (`id`,`name_id`,`score`,`date`) VALUES ('6','3','3101','2013-12-02');
INSERT INTO `scores` (`id`,`name_id`,`score`,`date`) VALUES ('6','2','2000','2015-12-02');
INSERT INTO `scores` (`id`,`name_id`,`score`,`date`) VALUES ('6','3','400','2013-12-02');
4

1 に答える 1

0

私の理解が正しければ、それぞれの最後の2 つのスコアが必要name_idです。

私は一時テーブルでこれに取り組みます:

ステップ 1.最後のスコア:

create temporary table temp_score1
    select name_id, max(`date`) as lastDate
    from scores
    group by name_id;
-- Add the appropriate indexes 
alter table temp_score1
    add unique index idx_name_id(name_id),
    add index idx_lastDate(lastDate);

ステップ 2.最後から 2 番目のスコア。考え方はまったく同じですがtemp_score1、データのフィルタリングに使用します。

create temporary table temp_score2
    select s.name_id, max(`date`) as penultimateDate
    from scores as s
        inner join temp_score1 as t on s.nameId = t.nameId
    where s.`date` < t.lastDate
    group by name_id;
-- Add the appropriate indexes
alter table temp_score2
    add unique index idx_name_id(name_id),
    add index idx_penultimateDate(penultimateDate);

ステップ 3.すべてをまとめます。

select 
    l.id, l.name,
    s1.lastScore, s2.penultimateScore
from
    `labels` as l
    left join temp_score1 as s1 on l.id = s1.name_id
    left join temp_score2 as s2 on l.id = s2.name_id

この 3 つのステップをストアド プロシージャ内に配置できます。

これがお役に立てば幸いです。

于 2013-02-17T19:49:00.543 に答える