Mysql - 我可以在 'order by' 子句之后使用 'having' 子句吗?

Mysql - Can I use the 'having' clause after 'order by' clause?

对于我创建的应用程序,我需要获取数据库中每个用户的上周(周一至周五)和每一天的详细信息。

现在,我的查询获取从今天开始的一个月中的每一天(因此,如果我们是 18 号,它将获取 18-17-16... 等等)和之前的一个月(在如果我们是第一个...)

但我想将 select 限制在前 8 天。我读了这个:

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

最后一个例子是我正在尝试做的。但问题是我需要先做一个order by。我需要按月 (DESC) 订购,而不是按天 (DESC) 订购,而且我需要执行 having 以获得我想要的。我没有订购就试过了,效果很好,但日子不对。因为默认情况下它是按 ASC 排序的。

仅举个例子,这是一个代表我的问题的查询,这是我所拥有的:

SELECT 
    day, id 
FROM 
    myTable 
WHERE 
    (month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 1 OR 
         month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 2) AND 
    year = EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AND 
    day <= EXTRACT(DAY FROM CURRENT_TIMESTAMP) 
ORDER BY 
    month DESC, 
    day DESC;

这是我想要的:

set @day := 0, @id:= '';

SELECT 
    day, id, @day := if(@id= id, @day + 1, 1) as day_number,
    @id := id as dummy 
FROM 
    myTable 
WHERE 
    (month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 1 OR 
         month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 2) AND 
    year = EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AND 
    day <= EXTRACT(DAY FROM CURRENT_TIMESTAMP) 
ORDER BY 
    month DESC, 
    day DESC 
HAVING 
    day_number <= 8;

但是我不能在 ORDER BY 之后加上 HAVING。如果我删除 ORDER BY 子句,我将获得 1 号和 8 号之间的每个 id 的所有日期。但我需要 18 到 10 之间。 (18 日为当前日期)

根据我在应用程序中的代码,它会在一周后停止,所以 select returns 周日到周六无所谓,我只想至少有星期一到星期五。这就是我选择数字“8”的原因,因为该应用程序只会在星期一执行此操作。

感谢任何help/suggestion!

您可以将查询包装在子查询中并在外部查询中执行过滤:

SET @day := 0, @id:= '';

SELECT day, id, day_number
FROM (
  SELECT 
      day, id, 
      @day := IF(@id = id, @day + 1, 
                  IF(@id := id, 1, 1)) as day_number
  FROM 
      myTable 
  WHERE 
      month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 1 OR 
      month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 2) AND 
      year = EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AND 
      day <= EXTRACT(DAY FROM CURRENT_TIMESTAMP) 
  ORDER BY 
    month DESC, 
    day DESC ) as t
WHERE  day_number <= 8;

外部查询使用 WHERE 子句来执行过滤。 HAVING 在组级别与 GROUP BY 和运算符结合使用。

注意: 上面的查询使用了嵌套条件,以便正确 read/write @id 变量。