2016-09-30 83 views
1

如何設置條件使用別名,其中最後一個順序的自定義字段創建的最大SQL函數和集團用戶的ID來last_order領域:的PostgreSQL在Where條件

SELECT "users"."id", "users"."name", "users"."email", "users"."type", "users"."created_at", MAX(TO_CHAR(order_details.created_at, 'YYYY-MM-dd HH24:MM')) AS last_order 
FROM "users" 
LEFT JOIN "order_details" on "order_details"."user_id" = "users"."id" 
WHERE EXISTS (
    SELECT * 
    FROM "roles" 
    LEFT JOIN "role_users" on "roles"."id" = "role_users"."role_id" 
    WHERE "role_users"."user_id" = "users"."id" and "slug" = 'member' 
) AND "users"."status" in (0) 
AND (LOWER(CAST("users"."id" as TEXT)) LIKE '%%' 
OR LOWER(CAST("email" as TEXT)) LIKE '%%' 
OR LOWER(CAST("last_order" as TEXT)) LIKE '%%' 
OR LOWER(CAST("name" as TEXT)) LIKE '%%') 
GROUP BY "users"."id" 
ORDER BY "created_at" desc 

我總是得到這樣的錯誤:

column "last_order" does not exist 

如何使用last_order?我已經把它放在別名中了。

即由數據表生成的查詢,故障原因是我對數據表的搜索功能中使用的別名,我的數據表的代碼就像下面:

columns: [ 
    { data: 'id', name: 'users.id', class: 'text-center', orderable: false }, 
    { data: 'email', name: 'email' }, 
    { data: 'last_order', name: 'last_order', class: 'text-center', orderable: true }, 
    { data: 'name', name: 'name' }, 
] 
+0

因爲你不能在where子句中使用別名。順便說一句,你不是由很多你不聚合的列組合 –

+0

@juergend那麼,如何將max函數字段包含到where子句? –

+0

使用'having'子句 –

回答

3

兩個問題:

  • 不能使用列別名在where子句中的select中定義。
  • 您不能在where子句中使用聚合函數。

移動狀態到having條款:

. . . 
GROUP BY "users"."id" 
HAVING LOWER(CAST(last_order as TEXT)) LIKE '%%' 
ORDER BY "created_at" desc 

我假設你like模式其實比'%%'更有趣。而且,對於日期/時間列,您不應該使用like。只需使用適當的相等/範圍比較或比較日期部分。

+0

如果所選列不在group by子句 –

+1

@juergend中,則postgres可能會引發錯誤。 。 。 Postgres支持(可選)ANSI標準在功能上允許'GROUP BY'中的函數依賴列,所以這不是問題,假設'users.id'是唯一的。 –

+0

@ GordonLinoff是的,這是正確的,但我的問題是,當我使用搜索表,查詢就像那樣,查詢是由數據表生成的,所以我不能改變查詢語句,我唯一需要的是我如何使用where條件的別名,或更改datatables列的名稱。 –