2013-05-08 83 views
0

我試圖選擇在我的postgreSQL表的「email」列中具有相同文本的條目。我完全是數據庫的新手,這是我創建的第一個數據庫,所以很抱歉,如果這是一個愚蠢的問題。我的數據庫有3列:key,user_mails和json_adress。 我試過postgresql:如何選擇滿足條件的條目

$existent= "SELECT * FROM 
      (SELECT public.account_recover_users.* AS keys,emails,jsons 
      FROM public.account_recover_users) 
      WHERE emails='$email'"; 

但我想我錯了某個地方。

請幫助,我想學習,我有點卡住了。

+0

您是否收到錯誤?究竟發生了什麼問題?我希望你使用某種php/postgres接口,因爲將sql語句分配給變量不足以實際查詢數據庫。顯示更多的代碼會有幫助。另外,您的查詢可能會大大簡化:''SELECT * FROM public.account_recover_users WHERE user_mails ='$ email''' – sgroves 2013-05-08 16:46:53

+0

@sgroves錯誤:FROM中的子查詢必須有別名 提示:例如,FROM(SELECT ... )[as] foo。 – 2013-05-08 16:48:53

+0

我更新了我的評論 - 在那裏嘗試查詢。 – sgroves 2013-05-08 16:50:23

回答

0

我正在寫另一個答案,因爲目前接受的答案在幾個方面都是錯誤的。即使OP不正確地接受答案,兩個提出的查詢都不能工作。
查詢無法有幾個原因的工作:

  • 正如提到的(和錯誤信息中明確指出):子查詢需要一個別名。

  • 正如之前提到的,子查詢對簡單任務來說毫無意義。

  • 此結構是無稽之談:public.account_recover_users.* AS keys擴大*到列的列表中後,您可以不適用別名。 Postgres只是忽略它。它可能會在將來的版本中引發異常。

  • 根據您的描述,現有欄目分別命名爲key,user_mailsjson_adress(原文如此!)。 emailsjsons只是無效的參考。

你絕對基本的查詢應該是:

"SELECT * FROM public.account_recover_users WHERE emails = '$email'" 

您可以通過底肥列別名重命名查詢列,但您WHERE子句不能引用輸出列(別名),它有參考輸入欄:

"SELECT key, user_mails AS email, json_adress AS jsons 
FROM public.account_recover_users 
WHERE user_mails = '$email'"

在此回答的相關答案的詳細解釋:
How to re-use result for SELECT, WHERE and ORDER BY clauses?

+0

謝謝,詳細的解釋是非常好的,因爲你的答案。 – 2013-05-09 09:52:51

1

您得到錯誤ERROR: subquery in FROM must have an alias Hint: For example, FROM (SELECT ...) [AS] foo的原因是因爲您必須爲您使用的任何子查詢提供別名(暱稱)。所以,只要做錯誤信息提示告訴你要做的事情:

"SELECT * 
FROM (
    SELECT public.account_recover_users.* AS keys, emails, jsons 
    FROM public.account_recover_users 
) as subq 
WHERE emails='$email'" 

但是你根本不需要子查詢。這可以簡化爲:

"SELECT * FROM account_recover_users WHERE user_mails='$email'" 

如果您想在選擇時重命名(即給別名)您的列,我不會使用子查詢。嘗試:

"SELECT key as keys, user_mails as emails, json_adress as jsons 
FROM account_recover_users 
WHERE emails='$email'" 

雖然我不真的推薦這個。如果你只是給每一列提供別名,爲什麼不重命名數據庫中的列呢?

0

由於您在派生表中(括號內)引用public.account_recover_users,因此您需要爲派生表提供別名,該別名幾乎可以是任何內容。

$existent= "SELECT * FROM 
(SELECT public.account_recover_users.* AS keys,emails,jsons 
FROM public.account_recover_users) as aru 
WHERE emails='$email'"; 

在你的情況,雖然我不認爲你需要一個派生表。你可以寫。

$existent = "SELECT key as keys, user_mail as emails, json_address as jsons 
FROM public.account_recover_users 
WHERE emails='$email'"; 
0

你不需要子查詢...(別名,如果你真的需要一個)。

您也不需要公開,因爲默認情況下它在您的搜索路徑中。

你也不需要這裏的領域,因爲你選擇了所有的領域。

SELECT * FROM account_recover_users WHERE user_mails='$email' 

哦,不要忘了逃跑$email ...看看到PDO::prepare()