我正在尝试在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'";
但我想我错了某个地方。
请帮助,我正在努力学习,而且我有点陷入困境。
答案 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只是忽略它。它可能会在将来的版本中引发异常。
根据您的说明,现有列名为key
,user_mails
和json_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 clauses?