2016-09-06 69 views
1

這裏是我的查詢:如何在GROUP BY子句中使用別名?

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 

它拋出這個錯誤:

# 1056 - Can't group on 'range_day'

如果我從GROUP BY條款刪除range_day,那麼它的工作原理也是如此。但我也需要根據range_day對結果進行分組。我怎樣才能做到這一點?

+2

'range_day'是計算列的別名。所以,它不能用於'group by'。改用實際計算。 –

+0

重複你的情況,當在組中將作品 –

+2

'range_day'是使用一個集合函數'MAX'來計算的。但是,您不能在group by子句中使用聚合函數。 –

回答

3

不知道你在做什麼。但是,您可以將查詢包裝到GROUP BY子句中沒有range_day的子查詢中。然後按照原樣在外部查詢中使用GROUP BY子句。

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 

但是 - 您選擇context沒有聚合,但未在GROUP BY子句中列出。因此,您將從組中獲得一些「隨機」值。在嚴格模式下,查詢將失敗。

+0

聽起來對我 – Drew

+0

你已經使用'內部和外部查詢的「GROUP BY」子句中的「range_day」。 – stack

+0

@stack - 抱歉,我確定,我刪除了它:-) - 測試時,您可能會發現其他一些錯誤。我沒有數據/模式來測試它。 –

2

您對range_day的定義並不完全合理。爲什麼它使用MAX()?什麼最大?

一種自然的方式,使查詢工作是從定義中移除MAX()

SELECT SUM(score) score, type, context, post_id, e.table_code, comment_id, 
     MIN(seen) as seen, MAX(date_time) as d_t, 
     (CASE WHEN FROM_UNIXTIME(date_time) >= CURDATE() THEN 'today' 
      WHEN FROM_UNIXTIME(date_time) >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) THEN 'yesterday' 
      WHEN FROM_UNIXTIME(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; 

更多評論:

  • IN ($ids)可能不會做你期望的。變量$ids被視爲單個值,因此這相當於e.di = $ids
  • 如果這不符合您的要求,那麼您可能需要MAX()處於某個其他級別的聚合。這將需要額外的子查詢。
+0

*「最大值是什麼?」*我想在MAX_DAY_TIME時添加幾行。我的意思是,當SUM()聚集了一些行時,我需要使用這些行中最大的'date_time'。 – stack

+0

奇怪..你的查詢按預期工作..但我敢肯定它不應該!我真的不知道它是如何工作的。 – stack

+0

謝謝.. upvote – stack

0

首先,你的問題......

您不能GROUP BY的總和。請注意0​​內部的MAX()。您的GROUP BY應該包括SELECT中的所有非彙總項目。 context丟失,並且可能導致在後續版本中發生錯誤

然後另外一個問題...

  MIN(seen) seen, 
     MAX(d_t) d_t, 
... 
ORDER BY seen, 
     MAX(d_t) desc 

通知不一致?含糊不清?是seen(在ORDER BY)應該是原始的seen,或別名seen,意思是MIN(seen)?同上d_t

當您需要稍後參考時,請務必避免將別名與列名稱拼寫相同。在WHERE中,它必須是列名;在ORDER BYHAVING中,它是別名。

那麼,我認爲,這是錯誤的:MAX(d_t) descORDER BY