2013-02-17 13 views
0

_如何用MySQL實現我想要的JOIN

大家好!

我有表

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.score值由得分進行排序.date and labels.before_score其中有倒數第二個值scores.score排序方式scores.date。我可以只在Mysql slq上執行此操作,以及如何執行此操作?

謝謝。

地址

例如,我對第一個表這樣的數據:

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); 

而第二臺

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'); 
+2

很難理解你在找什麼。請從每張表格中發佈一個樣本,並提供您希望產生的結果樣本。 – 2013-02-17 19:23:10

+0

對不起。我添加例子,我希望你明白我想要什麼。 – Nolik 2013-02-17 19:40:33

+0

您不需要將分數存儲在'labels'表中,因爲您將它存儲在'scores'表中。 – Barranka 2013-02-17 19:49:53

回答

0

如果我理解正確的話,你需要的最後一每個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步:倒數第二的成績。我們的想法是完全一樣的,但使用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 

你可以把一個存儲過程中這三個步驟。

希望這可以幫助你。