我有一个用户主表,其基本结构为
用户
userId | userName | userJoinedOn
159 |亚历克斯| 2015年8月23日
160 |史蒂夫| 2015年8月23日
161 |洛基| 2015年8月23日
用户交易表如下。这里user1和user2是users表的外键。
UserTransactions
user1 | user2 |交易
159 | 160 | 3
159 | 161 | 2
160 | 159 | 2
160 | 161 | 2
161 | 159 | 2
161 | 160 | 2
我想按如下方式检索上述交易:
user1Id | user1Name | user2Id | user2Name |交易
159 |亚历克斯| 160 |史蒂夫| 3
此外,它可以进一步缩小到两个彼此执行相同交易的用户。 像160和161一样,两者都完成了交易2。
我认为对于拥有大量用户的服务器而言,这将是非常耗费资源的。 请建议。
答案 0 :(得分:1)
只需加入2个表:
SELECT
u1.userId as user1Id,
u1.userName as user1Name,
u2.userId as user2Id,
u2.userName as user2Name,
ut.transaction
FROM
UserTransactions ut
INNER JOIN Users u1 ON (ut.user1 = u1.userId)
INNER JOIN Users u2 ON (ut.user2 = u2.userId)
SQL JOIN
子句用于组合来自两个或多个表的行,基于它们之间的公共字段。
最常见的连接类型是SQL INNER JOIN。 SQL INNER JOIN
返回满足连接条件的多个表中的所有行。
user1
表中的 UserTransactions
列引用userId
表中的Users
。 user2
表中的UserTransactions
列引用userId
表中的Users
。因此,我们必须将UserTransactions
加入Users
表两次。
答案 1 :(得分:0)
您需要两个联接:
select ut.User1Id, u1.userName, ut.User2Id, u2.userName, ut.transaction
from UserTransactions ut left join
Users u1
on ut.user1Id = u1.userid left join
Users u2
on ut.user2Id = u2.userid;
答案 2 :(得分:0)
使用别名加入users表两次:
select user1.userId , user1.username ,user2.userId , user2.username, transaction
from usertransaction join users user1 on user1=users.userid
join users user2 on user2=users.userid