0

所以,我正在使用专有数据,所以我不能在这里剪切粘贴我的代码。而且,我很抱歉这可能是微不足道的,但由于某种原因,我无法理解为什么它会重复。

所以,我有 4 张桌子

表 1 did, vid, sid, cid

表 2 视频,vname

表 3 sid、日期、值

表 4 cid、日期、值

我想要实现的是table1。做了,table2.vname,table3.sid,table3.date,table3.value,table4.cid,table4.date,table4.value

如果我做

    select table1.did, table2.vname, table3. . .
    from table 1
    join table 2 on table2.vid = table1.vid
    join table 3 on table3.sid = table1.sid and table3.date > now() - interval 1 year
    where table1.did = 1
    ;

我得到了我想要的。

    table1.did, table2.vname, table3.sid, table3.date, table3.value
    1,               blah,         123,    2013-3-1,        123
    1,               blah,         123,    2013-2-1,        3234
    1,               blah,         123,    2013-1-1,        111111     
    1,               blah,         123,    2012-12-1,       122222     
    1,               blah,         123,    2012-11-1,       155341     
    1,               blah,         123,    2012-10-1,       102002     

然后:

    select table1.did, table2.vname, table3. . ., table4. . .
    from table 1
    join table 2 on table2.vid = table1.vid
    join table 3 on table3.sid = table1.sid and table3.date > now() - interval 1 year
    join table 4 on table4.cid = table1.cid and table4.date > now() - interval 1 year
    where table1.did = 1
    ;

给我:

    t1.did, t2.vname, t3.sid, t3.date, t3.value, t4.cid, t4.date, t4.value
    1,       blah,     123,   2013-3-1,  123,    456,    2013-3-1,   1112345     
    1,       blah,     123,   2013-3-1,  123,    456,    2013-2-1,   234
    1,       blah,     123,   2013-3-1,  123,    456,    2013-1-1,   2
    1,       blah,     123,   2013-2-1,  3234,   456,    2012-12-1,  332111     
    1,       blah,     123,   2013-2-1,  3234,   456,    2012-11-1,  5432
    1,       blah,     123,   2013-2-1,  3234,   456,    2012-10-1,  555

无论如何,当我加入第四张桌子时,我可以防止重复吗?如果我切换第 3 次和第 4 次,它的工作方式相同,所以这肯定与我如何将它们连接在一起有关。

感谢您的帮助!

*编辑/解决方法*

我发现我觉得这样做很笨拙。我将其发布为答案,因为我知道它有效。但是,如果有人知道更好的方法来做到这一点,我会将其标记为已接受的答案。

添加一个名为“天”的新表

数据:

    day_id, dateYMD,    dateUS,      dateEU,      dayName
    1,      1970-01-01, 01/01/1970,  01/01/1970,  Thursday
    2,      1970-01-02, 01/02/1970,  02/01/1970,  Friday
    3,      1970-01-03, 01/03/1970,  03/01/1970,  Saturday
    . . .
    . . .
    . . .
    735322, 2013-03-30, 03/30/2013,  30/03/2013,  Saturday
    735323, 2013-03-31, 03/31/2013,  31/03/2013,  Sunday
    735324, 2013-04-01, 04/01/2013,  01/04/2013,  Monday

然后改变了我的查询:

    select table1.did, table2.vname, date_format(days.dateYMD, '%Y-%m-01') as daysYMD, table3. . ., table4. . .
    from table 1
    join days on days.dateYMD > now() - interval 1 year and days.dateYMD <= now()
    join table 2 on table2.vid = table1.vid
    join table 3 on table3.sid = table1.sid and table3.date = date_format(days.dateYMD, '%Y-%m-01')
    join table 4 on table4.cid = table1.cid and table4.date = date_format(days.dateYMD, '%Y-%m-01')
    where table1.did = 1
    group by daysYMD
    ;

再次,这完成了工作 - 但我想知道是否有人知道更好的方法。

谢谢!

4

1 回答 1

0

添加group by t3.vid, t4.cid到您的最后一个查询。

  select table1.did, table2.vname, table3. . ., table4. . .
    from table 1
    join table 2 on table2.vid = table1.vid
    join table 3 on table3.sid = table1.sid and table3.date > now() - interval 1 year
    join table 4 on table4.cid = table1.cid and table4.date > now() - interval 1 year
    where table1.did = 1
    Gropu by t3.vid, t4.cid
于 2013-03-29T20:21:59.523 回答