2017-02-15 18 views
0

現在、あるテーブルからオブジェクトをフェッチしようとしています。このため、私は、statsTableに 'oID'と 'Date'の両方の列に一致する行が含まれている限り、次の結合クエリを使用します。フォールバック値付きの2つのテーブルからカラムを取得

SELECT 
    o.ID as ID, 
    o.Image as Image, 
    o.Text as `Text`, 
    o.Views as `Views`, 
    o.Clicks as Clicks, 
    COALESCE(s.Views, 0) as DayViews, 
    COALESCE(s.Clicks, 0) as DayClicks 
FROM objectTable o 
LEFT JOIN statsTable s 
ON o.ID = s.oID 
WHERE o.userID = 1 
    AND DATEDIFF(CURDATE(), s.Date) < 1 
LIMIT 1 

statsTableに一致する行が含まれていない場合でも、結果の行を取得するためにクエリを変更する必要がありますか?

クエリでエラーが発生しないため、objectTableにデータがあることがわかっているので、空の結果を返すことは望ましくありません。

+0

既に左結合を使用しています。それはansです。私が既に言ったように、条件なしでチェックしてください。 –

+0

はい:左の結合の仕事** ** statsTableに参加するデータがある場合。しかし、データが入手できなくても結果が欲しい。 'Where'の代わりに何を使うべきですか? – DosMike1

答えて

1

あなただけON句にsテーブルの上に条件を移動する必要があります。

SELECT o.ID as ID, o.Image as Image, o.Text as `Text`, 
     o.Views as `Views`, o.Clicks as Clicks, 
     COALESCE(s.Views, 0) as DayViews, 
     COALESCE(s.Clicks, 0) as DayClicks 
FROM objectTable o LEFT JOIN 
    statsTable s 
    ON o.ID = s.oID AND DATEDIFF(CURDATE(), s.Date) < 1 
WHERE o.userID = 1 ; 

A LEFT JOINは関係なく、ON句が真かに評価されるかどうかの、最初のテーブルのすべての行を保持します。 2番目の表の列は一致しない行の場合はNULLです。WHERE句がフィルタされます。

この結果、の最初のテーブルの条件はWHERE句になります。後続の表の条件は、ON句(LEFT JOIN)にする必要があります。

+0

優れた深い知識:) 1つのあなたの説明のため –

+0

は意味を成して働く。どうもありがとうございました – DosMike1

関連する問題