0

だから、私は独自のデータを使用しているので、ここにコードをカットペーストすることはできません. そして、申し訳ありませんが、これはおそらく些細なことですが、何らかの理由で、重複している理由について頭を悩ませることができません。

だから、私は4つのテーブルを持っています

表 1 did、vid、sid、cid

表 2 vid、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

とにかく、4番目のテーブルに参加すると重複を防ぐことができますか? 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 に答える