多次连接同一个表是错误

时间:2014-05-25 02:39:32

标签: mysql

我有以下mysql代码

SELECT * FROM `user_credentials` 
  JOIN `friends` ON `friends`.`1stpal` = `user_credentials`.`cred_regiden`  
  JOIN `friends` ON `friends`.`2ndpal` = `user_credentials`.`cred_regiden` 
WHERE (`cred_fname` LIKE'".$search_text. "%') AND (`friends`.`1stpal` = '$current_user'
  OR `friends`.`2ndpal` = '$current_user')  LIMIT 0, 5;

我试图加入桌面的朋友'两次,这引发错误:不是唯一的表/别名:'朋友'。当我将脚本更改为以下时,

SELECT * FROM `user_credentials` 
  JOIN `friends` AS `f1` ON `friends`.`1stpal` = `user_credentials`.`cred_regiden`  
  JOIN `friends` AS `f2` ON `friends`.`2ndpal` = `user_credentials`.`cred_regiden` 
WHERE (`cred_fname` LIKE'".$search_text. "%') AND (`friends`.`1stpal` = '$current_user'
  OR `friends`.`2ndpal` = '$current_user')  LIMIT 0, 5;

现在说:Unknown column 'friends.1stpal'。 当我运行单个连接时,它完美地运行。但这不是我想要的,我想从表中得到结果。

3 个答案:

答案 0 :(得分:0)

在第二个示例中,您仍然使用表朋友,但您应该使用f1或f2。

答案 1 :(得分:0)

由于您使用别名f1和f2将其命名为表,因此您应该在查询中使用它们:

... ON `f1`.`1stpal` ...

答案 2 :(得分:0)

在多次连接到同一个表时,您需要使用表别名(缩写)。需要在整个查询中使用它们来消除列的歧义:

SELECT *
FROM `user_credentials` uc JOIN
     `friends` `f1`
     ON f1.`1stpal` = uc.`cred_regiden` JOIN
     `friends` `f2`
     ON f2.`2ndpal` = uc.`cred_regiden` 
WHERE (uc.`cred_fname` LIKE'".$search_text. "%') AND
      '$current_user' in (f1.`2ndpal`, f2.`1stpal`)
LIMIT 0, 5;

注意:我猜测where子句中的第二个条件。它可能是:

 '$current_user' in (f2.`2ndpal`, f1.1stpal`)

更多评论:

  • 如果您使用表别名,您可以将它们用于所有表格以便于阅读。
  • 不要在不需要它们的列名称周围使用反引号。他们只是弄乱了查询。
  • 在没有limit的情况下使用order by可能会很危险。返回的行将匹配,但可能会从查询更改为查询。
  • inor表达式的长序列(甚至是短序列)更容易编写和理解。