【问题标题】:MySQL query w/ COUNT() and HAVING based on date comparisonMySQL 查询 with/COUNT() 和 HAVING 基于日期比较
【发布时间】:2011-06-23 20:01:54
【问题描述】:

我正在尝试将我的计数结果限制为满足特定条件的结果。我目前正在使用 WHERE 子句,我的输出符合预期。

这是我当前的查询,如您所见,只有当我的 WHERE recdate 满足 14 天标记时,才会获取 *ads_list* 和 *ads_cate* 记录:

$queryCats = "
SELECT ads_cate.cateName, COUNT(ads_list.Title)
FROM
ads_cate
JOIN ads_list ON ads_cate.id = ads_list.category 
WHERE to_days(now())<=(to_days(recdate)+14)
GROUP BY ads_cate.cateName";

我希望检索所有类别和广告,但仅在满足我的 WHERE 子句条件时才计算在内。我一直在使用 HAVING,运气为 0,如下所示。也许有更好的方法?

$queryCats = "
SELECT ads_cate.cateName, ads_list.recdate, COUNT(ads_list.Title)
FROM
ads_cate
JOIN ads_list ON ads_cate.id = ads_list.category 
GROUP BY ads_cate.cateName
HAVING to_days(now())<=(to_days(recdate)+14)";

【问题讨论】:

  • 你的第一个查询已经这样做了
  • recdate 属于哪个表?
  • 问题是我的类别不在我的数组中以显示在我的结果集中。他们正在被过滤。我需要我的数组中可用的所有类别名称,无论它们是否符合该标准。

标签: php mysql sql count


【解决方案1】:

尝试使用LEFT JOIN 并将日期测试作为连接条件的一部分:

SELECT ac.cateName, COUNT(al.Title)
    FROM ads_cate ac
        LEFT JOIN ads_list al
            ON ac.id = al.category 
                AND to_days(now())<=(to_days(al.recdate)+14)
    GROUP BY ac.cateName

【讨论】:

  • Joe,你的样本很神奇。我猜是al。你的介绍和方法对我来说是新的,比如 al。 LEFT JOIN 的缩写。我猜 al.Title (al 部分)为表分配了别名。感谢您提供有趣的代码。
  • 你猜对了。 al 别名只是在整个查询中引用 ads_list 表的一种简便方法。在代码的LEFT JOIN ads_list al 部分期间引用表时,实际分配了别名。
  • 我明白你在那个“ads_list al”片段中的意思了。感谢您提供有用的课程。
【解决方案2】:

这可能有效:

SELECT ads_cate.cateName, ads_list.recdate, COUNT(CASE WHEN to_days(now())<=to_days((recdate)+14) THEN ads_list.Title ELSE NULL END) AS Title
FROM
ads_cate
JOIN ads_list ON ads_cate.id = ads_list.category 
GROUP BY ads_cate.cateName

【讨论】:

  • 尝试使用ELSE NULL,而不是ELSE 0,因为COUNT() 计算所有不是NULL 的东西。
  • @ypercube 感谢您指出这一点。编辑了上面的查询。
【解决方案3】:

将过滤后的计数放入子查询中,然后将类别表中的LEFT JOIN 放入子查询中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2013-09-16
    相关资源
    最近更新 更多