Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql语法在两个字段上连接_Mysql_Join - Fatal编程技术网

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中的记录也是唯一的。