postgresql:如何选择满足条件的条目

时间:2013-05-08 16:41:07

标签: php database postgresql select

我正在尝试在postgreSQL表的“email”列中选择具有相同文本的条目。我完全是数据库的新手,这是我创建的第一个数据库,很抱歉,如果这是一个愚蠢的问题。我的数据库有3列:key,user_mails和json_adress。 我试过了

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

但我想我错了某个地方。

请帮助,我正在努力学习,而且我有点陷入困境。

4 个答案:

答案 0 :(得分: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'"
但是,我并不是真的推荐这个。如果您只想为每列提供别名,为什么不重命名数据库中的列?

答案 1 :(得分: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'";

答案 2 :(得分:0)

您不需要子查询...(如果您确实需要,则为别名)。

您也不需要公开,因为它默认位于您的搜索路径中。

你也不需要这里的字段,因为你选择了所有字段。

SELECT * FROM account_recover_users WHERE user_mails='$email'

哦,不要忘记逃避$email ......看看PDO::prepare()

答案 3 :(得分:0)

我正在写另一个答案,因为目前接受的答案在几个方面都是错误的。即使OP错误地接受了答案,两个呈现的查询都不能正常工作 由于以下几个原因,原始查询无效:

  • 如前所述(并且错误消息明确指出):子查询需要别名。

  • 正如前面提到的,子查询对于简单的任务来说毫无意义。

  • 此构造是无意义的:public.account_recover_users.* AS keys在将*扩展到列列表后,您无法应用别名。 Postgres只是忽略它。它可能会在将来的版本中引发异常。

  • 根据您的说明,现有列名为keyuser_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?