2016-05-13 58 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之間選擇日期。

我想返回這個不存在的日期15.12.1993但計數爲0. 這甚至可能嗎?

感謝您的幫助,

Filip。

+0

您必須對包含所有日期的表進行「左連接」。但是你應該在你的程序邏輯中處理,而不是在SQL中 –

+0

或者,如果你沒有包含所有日期的表,你可以使用遞歸查詢來生成它們。 – 2016-05-13 10:56:54

+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未來的日期,沒有數據將被返回...我需要設置我的數據的最小和最大值。

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

我無法添加日曆表:/我只能使用現有的表。如果我的遊戲在特定日期沒有訪問,例如15.12.1993,則沒有行。 – Raiper34