mysql语法在两个字段上连接
我想将一个表连接到另一个表,其中第一个表中的两个字段中的任何一个都是第二个表的键 第二个表中有一些额外的信息,如果我在第一个表中的任何一个字段上找到匹配项,我想输入这些信息 表网络mysql语法在两个字段上连接,mysql,join,Mysql,Join,我想将一个表连接到另一个表,其中第一个表中的两个字段中的任何一个都是第二个表的键 第二个表中有一些额外的信息,如果我在第一个表中的任何一个字段上找到匹配项,我想输入这些信息 表网络 id | inviter | invitee | status 表userinfo id | userid | name 如果您没有访问第二个表,则进行查询 "SELECT * from network where inviter= '22' OR invitee ='22'" 我认为它类似于以下内容,但无法理
id | inviter | invitee | status
表userinfo
id | userid | name
如果您没有访问第二个表,则进行查询
"SELECT * from network where inviter= '22' OR invitee ='22'"
我认为它类似于以下内容,但无法理解语法:
"SELECT n.*,u.* from `network`, n
left join `users`, u on
n.inviter = u.id OR n.invitee= u.id
WHERE n.inviter = '22' or n.invitee= '22'"
非常感谢您的建议。试试这个:
SELECT a.inviter, a.invitee, a.status,b.userid, b.name FROM network a INNER JOIN userinfo b ON a.id = '22' AND b.id = '22';
要对联接使用多个键,请尝试以下操作:
SELECT SELECT a.inviter, a.invitee, a.status,b.userid, b.name FROM network a INNER JOIN userinfo b ON a.invitee = '22' AND b.userid = '22' OR a.inviter = '22' AND b.userid ='22';
您的语法几乎正确,只是不希望在表与其别名
a
或u
(可选地将用作关键字)之间使用逗号,并且需要对userinfo
进行第二次联接,因为您需要邀请者和被邀请者的不同数据:
SELECT
/* Use column aliases to distinguish inviter/invitee details */
n.id AS n_id,
n.status,
inviter.userid AS inviter_userid,
inviter.name AS inviter_name,
invitee.userid AS invitee_userid,
invitee.name AS invitee_name
FROM
network AS n
/* JOIN against `userinfo` twice: once to get inviter, once for invitee */
/* aliased as inviter/invitee */
LEFT JOIN userinfo AS inviter ON n.inviter = inviter.userid
LEFT JOIN userinfo AS invitee ON n.invitee = invitee.userid
WHERE
n.inviter = 22
OR n.invitee = 22
更新:
要仅返回其中一个匹配项,可以使用CASE
语句对其进行修改,以确定其中哪一个与WHERE
子句中的值相同:
SELECT
/* Use column aliases to distinguish inviter/invitee details */
n.id AS n_id,
n.status,
/* Return only one name, whichever matches the same value as in WHERE */
CASE
WHEN inviter.userid = 22 THEN inviter.name
WHEN invitee.userid = 22 THEN invitee.name
END AS name
FROM
network AS n
/* JOIN against `userinfo` twice: once to get inviter, once for invitee */
/* aliased as inviter/invitee */
LEFT JOIN userinfo AS inviter ON n.inviter = inviter.userid
LEFT JOIN userinfo AS invitee ON n.invitee = invitee.userid
WHERE
n.inviter = 22
OR n.invitee = 22
更新2:
好吧,仔细想想,如果你所需要的只是你已经知道的id的名称(22),那么就不需要2个连接。您仍然需要在子查询中使用大小写
,但它只需要返回id
SELECT
n.*,
u.*
FROM (
SELECT
id AS n_id,
status,
CASE
WHEN inviter = 22 THEN inviter
WHEN invitee = 22 THEN invitee
END AS i_id
FROM network
WHERE inviter = 22 OR invitee = 22
) n JOIN userinfo u ON n.i_id = userinfo.userid
我可以跳过列别名吗?拉取数据后,我不想区分邀请者和被邀请者。实际上,我想将它们显示/合并在一起。@user1260310如果要在需要按名称而不是位置引用列的API中使用别名,则需要别名。否则,只需查看它是否返回您需要的内容-我随意地将别名放入其中,因为否则会出现名称冲突。当我遵循上面的语法时,查询运行良好,但是,我现在有两组userinfo数据字段。对于显示,我只想对每条记录说$row['name'],并将其打印出来,不管它是邀请者匹配还是被邀请者匹配,但我认为我无法做到这一点。跳过联接的别名并联接n.invitee=userinfo.userid上的两个语句会引发错误。不确定要做什么。您有两组字段,因为您有两个不同的可能值。您如何确定要显示哪一个?您只想显示与WHERE子句(22)匹配的一个?逻辑应该是,如果inviter或invitee上存在匹配项,它将使用值22进入userinfo表并提取该用户的信息。值22是唯一的,该用户的userinfo中的记录也是唯一的。