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
变量。
对于我创建的应用程序,我需要获取数据库中每个用户的上周(周一至周五)和每一天的详细信息。
现在,我的查询获取从今天开始的一个月中的每一天(因此,如果我们是 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
变量。