我如何在GROUP BY子句中使用别名? [英] How can I use aliases on GROUP BY clause?

查看:734
本文介绍了我如何在GROUP BY子句中使用别名?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的查询:

pre $ SELECT SUM(分数)得分,
类型,
上下文,
post_id,
e.table_code,
comment_id,
MIN(看过)看过,
MAX(date_time)d_t,
(CASE WHEN FROM_UNIXTIME MAX(date_time))> = CURDATE()THEN'today'
WHEN FROM_UNIXTIME(MAX(date_time))> = DATE_SUB(CURDATE(),INTERVAL 1 DAY)THEN'昨天'
WHEN FROM_UNIXTIME (MAX(date_time))> = DATE_SUB(CURDATE(),INTERVAL 7DAY)THEN'在上周'
ELSE'在上个月'
END'中作为range_day
FROM`events ($ ids)
GROUP BY类型,post_id,e.table_code,comment_id,range_day
ORDER BY看过,MAX(date_time)desc,MAX(e。 id)desc

它引发这个错误:

< blockquote>

1056 - 无法在'range_day'上分组

如果我从<$ c $中删除 range_day c> GROUP BY 子句,那么它也可以工作。但是我还需要根据 range_day 对结果进行分组。我怎么能这样做?

解决方案

不知道你在做什么。但是你可以在GROUP BY子句中将查询封装到一个没有 range_day 的子查询中。然后在外部查询中原样使用GROUP BY子句。

  SELECT SUM(分数)分数,
类型,
上下文, - 警告!未列入分组by by
post_id,
table_code,
comment_id,
MIN(看过)看过,
MAX(d_t)d_t,
range_day
FROM(
SELECT SUM(分数)得分,
MAX(id)作为id,
类型,
上下文, - 警告! b $ b post_id,
e.table_code,
comment_id,
MIN(看过)看过,
MAX(date_time)d_t,
(CASE WHEN FROM_UNIXTIME(MAX date_time))> = CURDATE()THEN'today'
WHEN FROM_UNIXTIME(MAX(date_time))> = DATE_SUB(CURDATE(),INTERVAL 1 DAY)THEN'昨天'
WHEN FROM_UNIXTIME (date_time))> =上个月的'DATE_SUB(CURDATE(),INTERVAL 7 DAY)THEN'上个月的'
ELSE''
END)as range_day
FROM`events` e
WHERE e.id IN($ ids)
GROUP BY类型,post_id,e.table_code,comment_id
)sub
GROUP BY类型,post_id,t able_code,comment_id,range_day
ORDER BY seen,MAX(d_t)desc,MAX(id)desc



然而,你选择 context 而没有汇总,这在GROUP BY子句中没有列出。因此,您将从组中获得一些随机值。在严格模式下,查询将失败。


Here is my query:

SELECT  SUM(score) score,
    type,
    context,
    post_id,
    e.table_code,
    comment_id,
    MIN(seen) seen,
    MAX(date_time) d_t,
    (CASE   WHEN FROM_UNIXTIME(MAX(date_time)) >= CURDATE() THEN 'today'
        WHEN FROM_UNIXTIME(MAX(date_time)) >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) THEN 'yesterday'
        WHEN FROM_UNIXTIME(MAX(date_time)) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) THEN 'in last week'
        ELSE 'in last month'
    END) as range_day
FROM `events` e
WHERE e.id IN ($ids)
GROUP BY type, post_id, e.table_code, comment_id, range_day
ORDER BY seen, MAX(date_time) desc, MAX(e.id) desc

It throws this error:

#1056 - Can't group on 'range_day'

And if I remove range_day from GROUP BY clause, then it works as well. But I need to also group the result also based on range_day. How can I do that?

解决方案

Not sure what you are trying to do. But you can wrap your query into a subquery without range_day in the GROUP BY clause. Then use your GROUP BY clause in the outer query as it is.

SELECT  SUM(score) score,
    type,
    context, -- WARNING! Not listed in group by clause
    post_id,
    table_code,
    comment_id,
    MIN(seen) seen,
    MAX(d_t) d_t,
    range_day
FROM (
    SELECT  SUM(score) score,
        MAX(id) as id,
        type,
        context, -- WARNING! Not listed in group by clause
        post_id,
        e.table_code,
        comment_id,
        MIN(seen) seen,
        MAX(date_time) d_t,
        (CASE   WHEN FROM_UNIXTIME(MAX(date_time)) >= CURDATE() THEN 'today'
            WHEN FROM_UNIXTIME(MAX(date_time)) >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) THEN 'yesterday'
            WHEN FROM_UNIXTIME(MAX(date_time)) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) THEN 'in last week'
            ELSE 'in last month'
        END) as range_day
    FROM `events` e
    WHERE e.id IN ($ids)
    GROUP BY type, post_id, e.table_code, comment_id
) sub
GROUP BY type, post_id, table_code, comment_id, range_day
ORDER BY seen, MAX(d_t) desc, MAX(id) desc

However - you select context without aggregation wich is not listed in the GROUP BY clause. Thus you will get some "random" value from the group. In strict mode the query will fail.

这篇关于我如何在GROUP BY子句中使用别名?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆