我有以下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'
。
当我运行单个连接时,它完美地运行。但这不是我想要的,我想从表中得到结果。
答案 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
可能会很危险。返回的行将匹配,但可能会从查询更改为查询。in
比or
表达式的长序列(甚至是短序列)更容易编写和理解。