mysql语法连接两个字段

标签 mysql join

我想将一个表连接到另一个表,其中第一个表中的两个字段之一是第二个表的键。

第二个表只有一些附加信息,如果我在第一个表中的任一字段上找到匹配项,我想提取这些信息。

表格网络

id | inviter | invitee | status

表用户信息

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'"

非常感谢您的建议。

最佳答案

您的语法几乎是正确的,只是您不希望在表及其别名 a 之间使用逗号。或u (可以选择使用 AS 关键字),并且您需要针对 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 个连接。您仍然需要使用 CASE在子查询中,但它只需要返回 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

关于mysql语法连接两个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11746502/

相关文章:

MYSQL:在不递归运行查询的情况下计算值在结果中出现的次数

mysql - 如何通过连接表只显示具有相同值的一行

mysql - 在 EER 中应用外键限制

javascript - MySQL 和 View 的日期/时间格式化的正确方法,反之亦然

mysql - 防止重复输入数据库

mysql - 如何使用 "."作为千位分隔符和 ","作为小数点分隔符格式化数字?

php - 带有 php 响应的 ajax 请求按顺序,而不是在数组中

sql - month vs month查询(同表数据)

ruby - Logstash-输入文件插件以将数据保留在内存中

c# - 如何在 C# 中使用 Linq 在 Sql 中进行条件连接?