gpt4 book ai didi

mysql - 跨多个表查找记录的最小和最大日期

转载 作者:可可西里 更新时间:2023-11-01 07:41:20 26 4
gpt4 key购买 nike

我有 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() 则最小和最大日期都返回 NULL。

最佳答案

ifnull 的第二个参数用于比较最小值时,您应该使用遥远 future 的日期。否则,第一个 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'

你应该得到正确的结果。

关于mysql - 跨多个表查找记录的最小和最大日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11406206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com