专栏'代码'在where where子句是ambigous

时间:2016-07-22 08:51:30

标签: php mysql sql

我需要一些查询帮助。我想从三个不同的表中提取内容,这个表有不同的记录,所以code键与另一个表不同。该表包含登录的凭据,我需要检查代码和电子邮件是否在几乎一个表中找到,这是一个示例:

$Query = "SELECT * FROM login_tb1, login_tb2, login_tb3
                  WHERE (code = '".mysql_real_escape_string($code)."') OR 
                        (email = '".mysql_real_escape_string($email)."') ";

现在,当我执行此查询时,我收到此错误:

  

专栏'代码'在where子句是ambigous

我无法执行JOIN'因为列代码不同,所有记录都不同。无论如何,所有表都具有相同的结构。我该如何解决这个问题?

感谢。

4 个答案:

答案 0 :(得分:1)

我花了一段时间来理解错误信息。 Ambigous是一个如此奇特的词。在人类语言中,这意味着MySQL试图告诉你:"嘿,man,该列存在于select子句的多个表中,所以我不知道你的意思是哪个表!&# 34; 。你应该明确表格:

$Query = "SELECT * FROM login_tb1, login_tb2, login_tb3
                  WHERE (login_tb1.code = '".mysql_real_escape_string($code)."') OR 
                        (login_tb1.email = '".mysql_real_escape_string($email)."') ";

如果您不关心哪个表格并且它们具有相同的架构,您仍然需要明确,因此您的查询会更高级:

SELECT * FROM login_tb1 as l1, login_tb2 as l2, login_tb3 as l3
WHERE ( l1.code = 'code' OR l1.email = 'email' )
  OR  ( l2.code = 'code' OR l2.email = 'email' )
  OR  ( l3.code = 'code' OR l3.email = 'email' )

旁注:我不知道您的确切用例,但它看起来有点像反模式,您有多个具有看似相同架构的登录表。除非你有一个非常具体的理由,否则你应该将它保存在一个表中。

答案 1 :(得分:0)

代码列将是多个表的一部分。 在这种情况下前缀与表中的任何人.. 例如login_tb1.code

这可以解决问题

答案 2 :(得分:0)

你需要告诉mysql使用哪个code列。 显然,该列出现在多个表中,因此对于要检查代码列的每个表,请按以下方式编写: tablename.code

这样mysql就会知道要使用哪个列

我还建议看看你的ta le结构,因为有3个具有相同结构的表似乎很奇怪。 您也可以发布问题或详细说明。

答案 3 :(得分:0)

表格中有类似的列。您需要正确地对表格进行别名

$Query = "SELECT t1.col,t2.col,t3.col FROM login_tb1 as t1, 
login_tb2 as t2, login_tb3 as t3
                  WHERE (t1.code = '".mysql_real_escape_string($code)."') OR 
                        (t2.email = '".mysql_real_escape_string($email)."') ";