2017-04-15 71 views
0

我想通過「USER_LOCATION」,這是location.detail 的別名搜索用戶不會發現我做了這個以下查詢:LEFT JOIN在SELECT AS造成列別名在WHERE語句

SELECT user.*, location.detail as user_location 
FROM user 
LEFT JOIN location 
ON user.id = location.user_id 
WHERE user_location = 'jakarta'; 

它導致錯誤地說,

Column not found: 1054 Unknown column 'user_location' in 'where clause' 

爲什麼呢?解決辦法是什麼? 任何答案將不勝感激!

回答

3

您不能在創建它的相同查詢中的用戶名中使用別名。所以,你應該做的:

SELECT user.*, location.detail as user_location 
    FROM user 
     LEFT JOIN location 
      ON user.id = location.user_id 
WHERE location.detail = 'jakarta'; 

如果你仍然想使用該列,你必須把它包在一個子查詢:

select * from 
(
SELECT user.*, location.detail as user_location 
    FROM user 
     LEFT JOIN location 
      ON user.id = location.user_id 
) a 
where user_location = 'jakarta'; 

正如@ spencer7593提到你可以使用別名在同一個查詢HAVING條款。

+1

另一個(在性能方面不太理想)替代方法:列別名'user_location'可以在'HAVING'子句中引用。 'HAVING user_location ='jakarta''。 – spencer7593

+0

@ spencer7593是的,你是對的:)我沒有添加它,因爲它是在哪裏使用的部分。我將用這些信息編輯:)謝謝。 –

+2

@JorgeCampos。 。 。 MySQL實現了子查詢,所以這不是推薦的解決方案。 –

1

你不能在mysql的Where子句中使用別名。嘗試

SELECT user.*, location.detail as user_location 
FROM user 
LEFT JOIN location 
ON user.id = location.user_id 
WHERE location.detail = 'jakarta'; 
2

明顯且正確的解決方案是重複WHERE子句中的表達式。有時,表達式更復雜(想想距離計算)。 MySQL有一個擴展到SQL,它允許你使用HAVING用於此目的:

SELECT u.*, l.detail as user_location 
FROM user u LEFT JOIN 
    location l 
    ON u.id = l.user_id 
HAVING user_location = 'jakarta'; 

我真的不推薦它爲這個特定的查詢(畢竟,「USER_LOCATION」是更長的時間比「L型的。詳情」)。但是,在某些情況下,這可能很方便。

比這些考慮更重要的是您的查詢確實是INNER JOIN。您應該這樣指定:

SELECT u.*, l.detail as user_location 
FROM user u INNER JOIN 
    location l 
    ON u.id = l.user_id 
WHERE l.detail = 'jakarta'; 

過濾條件過濾掉所有不匹配的行。使用LEFT JOIN不當地混淆了人,並可能會混淆優化器。