mysql - 从最高ID行

时间:2016-03-01 16:56:48

标签: mysql

这将是简化的模式:

    CREATE TABLE Participant
    (`id` int, `Name` varchar(7))
;
    CREATE TABLE Term
    (`id` int, `participant_id` int, `start_date` date, `end_date` date)
;
INSERT INTO Participant
    (`id`, `Name`)
VALUES
    (1, 'Mike'),
    (2, 'John'),
    (3, 'Peter')
;    
    INSERT INTO Term
    (`id`, `participant_id`,`start_date`, `end_date`)
VALUES
    (1, '1', '2016-10-04', '2016-12-04'),
    (2, '1', '2016-05-04', '2016-07-04'),
    (3, '1', '2016-03-04', '2016-05-04')

然后我的查询就像这样

Select Participant.name, Term.id, Term.start_date, Term.end_date

from  Term
inner join Participant where Term.participant_id = Participant.id;

对于一位参与者,我只需要为最低ID术语start_date和最高ID术语end_date添加一个区域。

然后它应该看起来像:

Name Term.ID Term.Start_date Term.End_date Difference(days)*

Mike 1         2016-10-04    2016-12-04    154
Mike 2         2016-05-04    2016-07-04    154
Mike 3         2016-03-04    2016-05-04    154

*这是来自一个参与者的最低ID术语start_date和最高ID术语end_date之间的差异。并且每次为每个参与者显示相同的内容

因此,2016-10-04(ID 1 start_date)与2016-05-04(ID 3 end_date)之间存在差异。所以它将从10月到5月。这将产生154天的差异,或者-154,因为它会倒退。

我无法弄清楚逻辑是什么逻辑。如何在查询中找出该参与者条款中最高和最低ID项。

这是我到目前为止的地方:

    SELECT 
            participant.user_id, 
            participant.name, 
            term.term_id,
            term.start_date, 
            term.end_date

       /*DATEDIFF(MAX(term.pt_prgm_term_insur_start_date),MIN(term.pt_prgm_term_insur_end_date)) x */

FROM pt participant
    JOIN prgm_term term on participant.user_id = term.user_id 

这是它的结果:

user_id   user_name     term_id start_date  end_date     difference
29415     Yi            143770  2004-12-15  2005-06-13     563
29415     Yi            143771  2005-06-14  2005-12-17     563
29417     Guillermo     143772  2004-11-08  2005-07-07     ?
29418     Raul          143773  2004-11-08  2005-07-07     ?
29419     Volker        143774  2005-01-03  2005-08-01     ?
29420     Tomas         143775  2004-11-15  2006-06-13     ?
29415     Yi            143776  2005-12-18  2006-06-30     563
29422     Hulda         143777  2004-11-15  2006-06-13     ?
29424     Jan           143778  2004-11-15  2005-03-16     ?
29425     Catherine     143779  2004-12-01  2006-07-01     ?

所以如果我以易建联为例。 Yi有3个条款,ID为143770,143771和143776.所以我必须从143770(2004-12-15)捕获start_date,结束日期从143776(2006-06-30),计算天差并将其显示在"差异"所有易的所有条款的专栏。差异将是563天。

使用@strawberry提示我得到了这个

user_id   user_name     term_id     start_date  end_date     difference
1         Peter             155857  2003-10-01  2004-04-30  -212
16        Mika              155861  1997-11-01  1998-11-30  -394
17        Masayuki          155862  1997-11-01  1997-11-30  -29
18        Kazuko            155863  1997-11-01  1997-11-30  -29
418       Tobias            155915  1997-03-01  1997-09-30  -213
419       Dirk              155916  1997-03-01  1997-09-30  -213
420       Markus            155917  1998-03-01  1997-09-30   152
421       Ruth              155918  1997-03-01  1997-09-30  -213
422       Anne-Kathrin      155919  1997-03-01  1997-09-30  -213
423       Tobias            155920  1997-03-01  1997-09-30  -213

使用此查询

SELECT 
        participant.user_id, 
        participant.name, 
        term.term_id,
        term.start_date, 
        term.end_date,
        DATEDIFF(MIN(term.start_date),MAX(term.end_date)) x

FROM pt participant
JOIN pt_prgm_term term on participant.user_id = term.user_id 

group by user_id

差异是完美的,只有每个参与者显示一行(因为分组),而我需要显示所有术语并重现每个术语的差异。如果我按term_id分组,那么差异是在每个术语中计算的,而不是之前的计算方式(在最高和最低Id术语之间)

这应该是

 user_id   user_name     term_id     start_date  end_date     difference
    1         Peter             155857  2003-10-01  2004-04-30  -212
    1         Peter             155861  1997-11-01  1998-11-30  -212
    17        Masayuki          155862  1997-11-01  1997-11-30  -29
    18        Kazuko            155863  1997-11-01  1997-11-30  -29
    418       Rafael            155915  1997-03-01  1997-09-30  -220
    419       Dirk              155916  1997-03-01  1997-09-30  -210
    420       Markus            155917  1998-03-01  1997-09-30  -213
    420       Markus            155918  1997-03-01  1997-09-30  -213
    420       Markus            155919  1997-03-01  1997-09-30  -213
    423       Tobias            155920  1997-03-01  1997-09-30  -229

彼得和马库斯将成为例子

2 个答案:

答案 0 :(得分:1)

最后我找到了答案。非常感谢@Strawberry为我指路。

我必须在select语句中创建一个子查询才能获得正确的信息。

最后的查询是:

SELECT 
        participant.user_id as participant_ID, 
        participant.name, 
        term.term_id,
        term.start_date, 
        term.end_date,

(select 

        DATEDIFF(MIN(term.start_date),MAX(term.end_date))

        from
        pt participant
        join
        pt_prgm_term term on participant.user_id = term.user_id 

        WHERE participant.user_id = participant_ID
        GROUP BY participant.user_id ) as difference


FROM pt participant
JOIN pt_prgm_term term on participant.user_id = term.user_id 

答案 1 :(得分:0)

SELECT DATEDIFF(MAX(start_date),MIN(end_date)) x FROM term;