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
在我开发的消息传递应用程序中,我有 table 个具有基本帐户信息(名字、姓氏、用户名、加密密码等)的用户和 table 个具有两列的联系人(前一个 table) 的外键显示一个用户在他的联系人中有另一个。两个 table 都有一个标准的自增 id 列作为主键。
我有一个搜索栏,允许用户通过搜索关键字找到其他人,以便他们可以在联系人中为他们添加书签。我可以使用这种类型的查询来获取这些数据,其中 $word
是搜索词,$id
是来自会话 table:
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