4

我有 3 张桌子:

file_list => list of all files on web server  
stats_web => number of pageviews from public web  
stats_reg => number of pageviews from "registered users" 

我在http://sqlfiddle.com/#!2/98c6a/1/0上有架构和一些示例数据

我正在尝试计算文件首次被公众或注册用户点击的日期。

当前 SQL 如下所示:

SELECT
    list.path,
    list.mod_date,
    IF(MIN(ifnull(web.hit_date, 0000-00-00)) < MIN(ifnull(reg.hit_date, 0000-00-00)), MIN(ifnull(web.hit_date, 0000-00-00)), MIN(ifnull(reg.hit_date, 0000-00-00))) AS 'min_date',
    IF(MAX(ifnull(web.hit_date, 0000-00-00)) > MAX(ifnull(reg.hit_date, 0000-00-00)), MAX(ifnull(web.hit_date, 0000-00-00)), MAX(ifnull(reg.hit_date, 0000-00-00))) AS 'max_date',    
    SUM(ifnull(web.pages, 0)) + SUM(ifnull(reg.pages, 0)) AS 'page_views'
FROM
    file_list list
    LEFT JOIN
         stats_web web ON list.path = web.path
    LEFT JOIN
         stats_reg reg ON list.path = reg.path
WHERE
list.path LIKE '/web/htdocs/%'
GROUP BY list.path;

问题是,如果一条记录仅出现在一个统计表中,则最小日期始终为 0。这是因为 MIN 和 MAX 上的 ifnull() 但如果我不使用 ifnull() 那么 min 和 max日期返回 NULL。

4

1 回答 1

1

您应该使用遥远将来的日期作为ifnull用于比较最小值的第二个参数。否则,第一个null将成为0000-00-00最小值,并且由于它是最早的日期,因此没有其他日期能够超过它成为最小值。

如果您将查询的第四行更改为

IF(MIN(ifnull(web.hit_date, 9999-12-31)) < MIN(ifnull(reg.hit_date, 9999-12-31)), MIN(ifnull(web.hit_date, 9999-12-31)), MIN(ifnull(reg.hit_date, 9999-12-31))) AS 'min_date'

你应该得到正确的结果。

于 2012-07-10T03:38:36.770 回答