MySQL加入混乱

MySQL Joining Mess

在我开发的消息传递应用程序中,我有 table 个具有基本帐户信息(名字、姓氏、用户名、加密密码等)的用户和 table 个具有两列的联系人(前一个 table) 的外键显示一个用户在他的联系人中有另一个。两个 table 都有一个标准的自增 id 列作为主键。

我有一个搜索栏,允许用户通过搜索关键字找到其他人,以便他们可以在联系人中为他们添加书签。我可以使用这种类型的查询来获取这些数据,其中 $word 是搜索词,$id 是来自会话 table:

的登录用户 ID
select firstname
     , lastname
     , username
     , id 
  from users 
 where (locate('$word', username) > 0 
     or locate('$word', firstname) > 0 
     or locate('$word', lastname) > 0) 
   and id <> '$id' 
 order 
    by username desc 
 limit 20

但我发现用户有必要知道他正在搜索的用户是否已经在他们的联系人中,所以我需要加入联系信息。我试过这个查询:

select users.firstname, 
       users.lastname, 
       users.username, 
       users.id, 
       contactsPrime.id as contact from users 
left join 
       (select * from contacts as contactsPrime 
       where contacts.userID = '$id') 
on users.id = contactsPrime.contactID 
       and (locate('$word', users.username) > 0 
          or locate('$word', users.firstname) > 0 
          or locate('$word', users.lastname) > 0) 
order by username desc limit 20

我使用了别名 table contactsPrime,但我仍然收到错误消息,我的所有派生 table 都没有别名。我哪里做错了?有没有更好的方法可以达到我想要的效果?

关于范围contactsPrime的范围在()内,外部无法访问。

   (select * from contacts as contactsPrime 
   where contacts.userID = '$id') 

你会在下面一行得到错误

on users.id = contactsPrime.contactID

您需要将其更改为

(select * from contacts where contacts.userID = '$id') as contactsPrime