0

I am trying to select the entries that have the same text in the "email" column of my postgreSQL table. I am completly new to database and this is the first database I ever created, so sorry if it's a silly question. My database has 3 columns: key, user_mails and json_adress. I tried

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

but I guess I am mistaking somewhere.

Please help, I am trying to learn and I got a bit stuck.

4

4 回答 4

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'"

不过,我真的不推荐这个。如果您只想为每一列赋予别名,为什么不重命名数据库中的列呢?

于 2013-05-08T16:54:23.063 回答
0

您不需要子查询...(如果您确实需要,请使用别名)。

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

您也不需要此处的字段,因为您选择了所有字段。

SELECT * FROM account_recover_users WHERE user_mails='$email'

哦,别忘了逃跑$email……看看PDO::prepare()

于 2013-05-08T16:59:32.410 回答
0

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

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

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

  • 这个结构是无稽之谈:在扩展列列表public.account_recover_users.* AS keys不能应用别名。Postgres 只是忽略它。它可能会在未来的版本中引发异常。*

  • 根据您的描述,现有列被命名为key,user_mailsjson_adress(原文如此!)。emails或者jsons只是无效的参考。

您绝对基本的查询应该是:

"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 子句?

于 2013-05-08T19:55:08.613 回答
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'";
于 2013-05-08T16:55:10.087 回答