如何正确地 JOIN 3 个表

How to correctly JOIN 3 tables

我正在尝试创建一个包含用户(一般)和另外两个 table 的数据库,即:男性/女性选择。这将用于约会,更具体地说,女孩投票给男孩,男孩投票给女孩。如果他们的选择是重叠的,那就意味着他们很合得来。

我不知道我是否很好地接近了这个主题,但到目前为止我已经构建了以下代码:

USERS:
| ID (PRIMARY) |  NAME  | GENDER |
|       1      | Man1   | Male   |
|       2      | Man2   | Male   |
|       3      | Woman1 | Female |
|       4      | Woman2 | Female |
Woman_Result
| ID (PRIMARY) | ID_PERSON | ID_CHOOSE |
|       1      |    3      |    1      |
|       2      |    3      |    2      |
|       3      |    4      |    1      |
Man_Result
| ID (PRIMARY) | ID_PERSON | ID_CHOOSE |
|       1      |    1      |    4      |
|       2      |    2      |    1      |

那么匹配的人只有:男人1和女人2

SELECT  w.*, m.*
    FROM  Man_Result AS m
    JOIN  Woman_Result AS w
    WHERE w.ID_CHOOSE = m.ID_PERSON AND m.ID_CHOOSE = w.ID_PERSON

输出:

| ID | ID_PERSON | ID_CHOOSE | ID | ID_PERSON | ID_CHOOSE |
| 1  |     1     |     4     | 1  |     4     |     1     |

所以它的工作原理,但我如何将它连接到我的用户 table 以获得这些输出:

NAME | NAME
Man1 | Woman2

我已经结合了类似的东西,但我完全不知道如何结合它才能让它发挥作用:)

SELECT USERS.NAME
FROM USERS
INNER JOIN Woman_Result ON USERS.ID = Woman_Result.ID_PERSON
INNER JOIN Man_Result ON USERS.ID = Man_Result.ID_PERSON

-- 编辑--

如果我想为每个用户添加“ID_CHOOSE2”、“ID_CHOOSE3”等,我必须创建什么样的查询才能使其正确?我试过使用“或”:

ON w.ID_CHOOSE OR w.ID_CHOOSE2 = m.ID_PERSON AND m.ID_CHOOSE OR m.ID_CHOOSE2 = w.ID_PERSON

ON (w.ID_CHOOSE = m.ID_PERSON AND m.ID_CHOOSE = w.ID_PERSON)
OR (w.ID_CHOOSE2 = m.ID_PERSON AND m.ID_CHOOSE2 = w.ID_PERSON)

但是第二个例子只比较了相同的列,我的意思是它把每个列都比较了,就像在一个人的例子中一样

我的代码:https://onecompiler.com/mysql/3xz4552uv

您必须将 USERS 的 2 个副本加入您当前的加入。
第一份将 return 男人的名字,第二份将 return 女人的名字:

SELECT um.NAME AS man_name,
       uw.NAME AS woman_name
FROM Man_Result AS m JOIN Woman_Result AS w 
ON w.ID_CHOOSE = m.ID_PERSON AND m.ID_CHOOSE = w.ID_PERSON
JOIN USERS AS um ON m.ID_PERSON = um.ID
JOIN USERS AS uw ON w.ID_PERSON = uw.ID;

参见demo

好的,如果您决定在 ONE TABLE 中调用 matches,那么这就是您应该用来取回结果的查询

id  uid1  uid2
1   1     4
2   2     1
3   3     1
4   3     2
5   4     1
6   1     2

匹配 table 有 iduid1uid2 和一个主键,它是 (uid1,uid2)

的组合

那么你的查询应该是这样的

SELECT
    C.name, D.name
FROM matches A
INNER JOIN matches B 
    ON A.uId1 = B.uId2 AND A.uId2 = B.pId1 AND B.Id > A.Id
INNER JOIN users C ON A.uId1 = C.Id
INNER JOIN users D ON A.uId2 = D.Id

或者您可以像下面这样用 CTE 来完成,这样会更快一些:

;WITH DATA AS (
SELECT
    A.*
FROM matches A
INNER JOIN matches B 
    ON A.uId1 = B.uId2 AND A.uId2 = B.uId1 AND B.Id > A.Id )

SELECT
    C.name, D.name
FROM DATA A
INNER JOIN users C ON A.uId1 = C.Id
INNER JOIN users D ON A.uId2 = D.Id

如果您无法更改 SQL table 及其结构,我会使用 temp variable 来完成,如下所示:

DECLARE @STARTDATA TABLE ( uid1 int, uid2 int, primary key (uid1, uid2) )

INSERT INTO @STARTDATA (uid1, uid2)
SELECT
    A.uid1, A.uid2
FROM matches A
INNER JOIN matches B 
    ON A.uId1 = B.uId2 AND A.uId2 = B.uId1 AND B.Id > A.Id

SELECT
    C.name, D.name
FROM @STARTDATA A
INNER JOIN users C ON A.uId1 = C.Id
INNER JOIN users D ON A.uId2 = D.Id

希望对您有所帮助!