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

时间:2016-04-18 13:49:25

标签: mysql having

对于我制作的应用程序,我需要在上周(星期一到星期五)以及我在数据库中拥有的每个用户的每一天的详细信息。

现在,我的查询从今天的每一天开始到今天(所以如果我们是第18个,它将会得到18-17-16 ......等等)和前一个月(如果我们'是第一个...)

但我想将选择限制在前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;

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

使用我在应用程序中的代码,它将在一周后停止,所以如果select在星期六返回周日并不重要,我只想至少在星期一到星期五。这就是我使用数字'8'的原因,因为应用程序将仅在星期一执行此操作。

感谢您的任何帮助/建议!

1 个答案:

答案 0 :(得分:0)

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

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和运营商一起使用。

注意:以上查询使用嵌套条件来正确读/写@id变量。