2016-05-13 3 views
3

に存在しない場合、私は、SQLクエリ0何行が

SELECT DATE_FORMAT(date,'%d.%m. %y') as date, COUNT(idStat) as number 
    FROM stat 
    WHERE IdGame = ? AND date >= ? AND date <= ? 
    GROUP BY date 

を以下しているそれは、日付とどのくらいの人が、この日の試合を訪れたが、どのように行がこの日存在しない場合は、0を返すことを返しますか?

たとえば、15.12.1993日はdbには存在しませんが、ユーザーは日付を15.10.1950から12.15.2020に選択します。

私はこれが存在しないこの日付を1995年12月15日に返すことを望みますが、カウントは0です。 これは可能ですか?

ありがとうございます。

フィリップ。

+0

すべての日付を含むテーブルに対して 'left join'する必要があります。しかし、プログラムロジックではなくSQLで処理する必要があります –

+0

また、すべての日付のテーブルがない場合は、再帰クエリを使用してテーブルを生成できます。 –

+0

が同じテーブルの日付です...テーブルには日付の列、都市の列、IPアドレスの列... – Raiper34

答えて

0

私は、このリンクから、私の問題を解決するためにRedFilter回答を使用:generate days from date range

私のクエリは次のようになります。

select DATE_FORMAT(a.Date,'%d.%m. %Y'), COUNT(stat.IdStat) 
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date 
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a 
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b 
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c 
) as a LEFT JOIN stat ON a.Date = stat.date 
where a.Date between ? and ? AND (stat.IdGame = ? OR stat.IdGame IS NULL) GROUP BY a.Date 

しかし、私は将来の日付を削除必要がある、私が使用している場合ので、私のdatapickerを形成このSQLのfutue日付、データは返されません...私は私のdatapickerのminとmaxを設定する必要があります。

5

Calendarのテーブルを適切な日付にするのが最善の方法です。その後、left joinを使用して日付を取得することができます。

SELECT DATE_FORMAT(c.date,'%d.%m. %y') as date, COUNT(s.idStat) as number 
FROM Calendar c LEFT JOIN 
    stat s 
    ON c.date = s.date AND s.IdGame = ? 
WHERE c.date >= ? AND c.date <= ? 
GROUP BY c.date; 

あなたはすべての日にゲームを持っていますが、問題は、特定のゲームは一日ではないということであるならば、あなたはこのショートカットを使用することができます:

SELECT DATE_FORMAT(date,'%d.%m. %y') as date, SUM(IdGame = ?) as number 
FROM stat 
WHERE date >= ? AND date <= ? 
GROUP BY date; 

このこのような何かすべての場合に機能しませんが、それは便利なショートカットになる可能性があります。

+0

私はカレンダーテーブルを追加できません:/私は既存のテーブルでのみ動作できます。私のゲームが1993年12月15日のように特定の日付に訪問していない場合は、行がありません。 – Raiper34

関連する問題