2013-05-08 86 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()