0

「ユーザー」と呼ばれるテーブルと「アイテム」と呼ばれるテーブルの 2 つのテーブルがあります。フィールド users.eventdate が現在から 3 日以内にあるユーザーからの ID のリストをコンパイルしようとしています。さらに複雑にするために、items.startingdate が今から 3 日以内かどうかも調べています。

したがって、users.eventdate が現在から 3 日以内であるか、現在から 3 日以内に item.startdate がある場合は、users.ID を返します。ユーザーとアイテムの関係は、users.ggProjectId と items.uID です。

私は現在持っています:

 $strSQL  = "SELECT users.ID, users.ggProjectId, users.timezone, users.ggTimestamp, users.slug, items.uID
        FROM items
        JOIN users ON users.ggProjectId = items.uID
        WHERE ( users.eventdate <= DATE( NOW( ) + INTERVAL 2 DAY ) 
        AND users.eventdate >= DATE( NOW( ) - INTERVAL 2 DAY )) OR 
        ( items.startingtime <= DATE( NOW( ) + INTERVAL 2 DAY ) 
        AND items.startingtime >= DATE( NOW( ) - INTERVAL 2 DAY ))
        GROUP BY users.ggProjectId";

問題は、ユーザー レコードのアイテムがない場合、eventdate が時間枠内にあるため、必要であっても結果として得られないことです。それを殺しているのはJOINだと思います。

4

1 に答える 1

1

結合するテーブルにデータが存在しない可能性がある場合は、次を使用しますLEFT JOIN

SELECT
     users.ID
    ,users.ggProjectId
    ,users.timezone
    ,users.ggTimestamp
    ,users.slug
    ,items.uID
FROM users
LEFT JOIN items
 ON users.ggProjectId = items.uID
WHERE 
    (
         users.eventdate <= DATE( NOW( ) + INTERVAL 2 DAY ) 
     AND users.eventdate >= DATE( NOW( ) - INTERVAL 2 DAY )
    ) OR ( 
         items.startingtime <= DATE( NOW( ) + INTERVAL 2 DAY ) 
     AND items.startingtime >= DATE( NOW( ) - INTERVAL 2 DAY )
    )
GROUP BY users.ggProjectId

を使用LEFT JOINすると、最初のテーブル (「左側」) のすべての行が返され、キーに基づいて他のテーブルが結合されます。キーは「右側」に一致する場合と一致しない場合があります。

于 2013-10-23T14:58:03.753 に答える