2

適切にクエリする方法を理解するのに苦労しているので、誰かが助けてくれることを願っています

Member テーブルと Member_Card テーブルがあります。Member_Card には列 Member があるため、カードはメンバーに関連付けられています。どちらのテーブルにも LastModifiedDate 列があります。メンバーは、1 つまたは複数のカードを持つことができます。

LastModifiedDate >= sinceDate (指定された日付) またはカード (存在する場合) LastModifiedDate >= sinceDate のすべてのメンバーを返す必要があります。

sinceDate が 2013-01-01 00:00:00 であると想像してください。私はこのようなものを出力したい:

[{
    "Id": "001O000000FsAs7IAF",
    "LastModifiedDate": 2013-01-01 00:00:00,
    "Member_Card": null
}, {
    "Id": "001O000000FrpIXIAZ",
    "LastModifiedDate": 2012-12-12 00:00:00,

    "Member_Card": [{
        "Id": "a00O0000002w8FGIAY",
        "Member": "001O000000FhDSoIAN",
        "LastModifiedDate": 2013-01-01 00:00:00

    }, {
        "Id": "a00O0000002uYMtIAM",
        "Member": "001O000000FhDSoIAN",
        "LastModifiedDate": 2012-12-12 00:00:00
    }]
}, {
    "Id": "001O000000FsAg7IAF",
    "LastModifiedDate": 2013-01-01 00:00:00,
    "Member_Card": [{
        "Id": "a00O0000002w8FFIAY",
        "Member": "001O000000FhDSoIAN",
        "LastModifiedDate": 2012-12-12 00:00:00
    }]
}]

1 つ目は、LastModifiedDate がカードなしで一致するメンバーです。2 番目は、一致しない LastModifiedDate を持つメンバーですが、2 つのカードが関連付けられており、そのうちの 1 つは一致する LastModifiedDate を持っています。3 つ目は、LastModifiedDate がカードと一致するメンバーです。

SOのおかげで、次のクエリを取得しました。

SELECT member.*,card.* from member inner join (
SELECT distinct member.id as  mid FROM Member 
INNER JOIN Member_Card 
    ON Member_Card.Member = Member.id 
and ( Member.LastModifiedDate >= sinceDate  
    OR Member_Card.LastModifiedDate >= sinceDate ) ) a on a.mid=member.id
inner join member_card card on card.member=a.mid

これは正常に機能しますが、メンバーにカードが関連付けられていない場合がありません。

いくつかの INNER JOIN を LEFT JOIN に変更しようとしましたが、日付の比較が無視されています :-(

これを手伝ってくれませんか?

4

3 に答える 3

4

日付チェックを内部クエリの where に移動します。

次のようなものを試してください:

SELECT member.*,card.* 
FROM member 
LEFT JOIN member_card card on card.member=member.id
WHERE member.id IN (
    SELECT DISTINCT m.id FROM Member m
        LEFT JOIN Member_Card mc ON (mc.Member = m.id)
        WHERE ( m.LastModifiedDate >= sinceDate  
        OR mc.LastModifiedDate >= sinceDate ) 
)
于 2013-08-08T10:16:06.093 に答える
0

このように試すことができます。

SELECT o.status, o.date, c.name
FROM cliente c
LEFT JOIN orders o
ON c.id=o.id 
WHERE o.date = '2/1/2015'
于 2015-03-25T08:05:52.543 に答える