如何正确地 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)
但是第二个例子只比较了相同的列,我的意思是它把每个列都比较了,就像在一个人的例子中一样
您必须将 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 有 id
、uid1
、uid2
和一个主键,它是 (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
希望对您有所帮助!
我正在尝试创建一个包含用户(一般)和另外两个 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)
但是第二个例子只比较了相同的列,我的意思是它把每个列都比较了,就像在一个人的例子中一样
您必须将 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 有 id
、uid1
、uid2
和一个主键,它是 (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
希望对您有所帮助!