2014-12-01 91 views
0

我有一個MySQL查詢:使用mysql列別名在where子句

SELECT created_at as date FROM table 

所以我創建了created_at列的別名。現在我想在我的WHERE子句中使用這個別名:

SELECT created_at as date FROM table WHERE date = 'xxxx-xx-xx' 

這不起作用。 Mysql希望我使用真正的列名。有什麼辦法以我想要的方式去做?

背景:我從幾個表中選擇記錄並使用UNION將它們聯合起來。所有表都有一個日期列,但在每個表中命名都不同。但我想對聯合記錄做WHERE,因此我需要始終使用相同的列名稱

+0

利用你的表索引一個外部選擇以上的所有工會,然後在哪裏用日期。 – 2014-12-01 18:51:58

+1

您不能在查詢的子句中使用別名,就像您在此處所做的那樣。你真的不應該使用幾乎與關鍵字重複的別名。 – 2014-12-01 18:52:03

回答

0

您問:「有沒有辦法按照我想要的方式去做?

是的,但它需要使用子查詢或視圖。

SELECT date 
FROM (SELECT created_at as date FROM table) B 
WHERE date = 'xxxx-xx-xx' 

隨着工會的情況下...

SELECT * from (
Select col1, col2,col3 as date from A 
union 
select col1, col4,col5 from B) inlineView 
WHERE date = 'somedate' 

你正在運行到的問題是操作的數據庫中的順序。

  1. FROM子句
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING子句
  5. SELECT子句
  6. ORDER BY子句

(順序從http://www.bennadel.com/blog/70-sql-query-order-of-operations.htm截取) 不同訂單被發現MySQL Order of Operations?

所以現在我必須做一些研究來找出哪一個是正確的;或者它是否因RDBMS而異...

因此where子句在select被評估之前被執行。因此,它不知道你有別名。你可以欺騙編譯器,通過做一個子選擇來按照你想要的from子句的方式創建數據列。

1

如果你絕對必須使用你的別名作爲選擇標準的一部分,那麼你需要使用HAVING而非WHERE

SELECT created_at as date FROM table HAVING date = 'xxxx-xx-xx' 

但它是更好,因爲其他人閱讀使用的列名和WHERE您代碼會發現WHERE的含義比HAVING更明顯;它將不能有效地要麼

0

哪裏不對別名工作..你更好,你可以通過使用列的別名組table_name.column_namem ..

SELECT created_at FROM table WHERE table.created_at = 'xxxx-xx-xx' <--more readable, isn't it?