2012-07-10 45 views
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 这是因为IFNULL(中)在MIN和MAX,但如果我不使用ifnull(),则最小和最大日期都会返回NULL。

回答

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' 

你应该得到正确的结果。

+0

谢谢dasblinkenlight这个工程很好,但它已经出现了第二个问题。那就是说,如果条目只存在于file_list表中,那么你会得到'9956'作为min_date。 – StefWill 2012-07-10 06:04:56