如何在sql中连接多个表
嗨,朋友们,我有3张表加满、取款和转账。这3张表属于用户表。我必须找到所有属于用户的记录。我尝试了使用内部联接,如下所示:-如何在sql中连接多个表,sql,postgresql,inner-join,Sql,Postgresql,Inner Join,嗨,朋友们,我有3张表加满、取款和转账。这3张表属于用户表。我必须找到所有属于用户的记录。我尝试了使用内部联接,如下所示:- SELECT * FROM users u INNER JOIN topups t ON u.id = t.user_id INNER JOIN withdraws w ON u.id = w.user_id INNER JOIN transfers tf ON u.id = tf.user_id 但是这个查询只返回3个表之间的公共记录。我必须为每个表找到属
SELECT * FROM users u
INNER JOIN topups t
ON u.id = t.user_id
INNER JOIN withdraws w
ON u.id = w.user_id
INNER JOIN transfers tf
ON u.id = tf.user_id
但是这个查询只返回3个表之间的公共记录。我必须为每个表找到属于用户的所有记录
假设我在补足中有2条记录属于用户id 1,在取款中有3条记录属于用户id 2,在转账中有5条记录属于用户id 3,那么我应该得到总共10条记录
样本数据:-
加满
+--------+---------+---------+
| amount | result | user_id |
+--------+---------+---------+
| 10 | success | 1 |
| 20 | failed | 2 |
+--------+---------+---------+
+---------+----------+
|w_amount | user_id |
+---------+----------+
| 10 | 1 |
| 20 | 2 |
| 30 | 10 |
+---------+----------+
+--------+--------+---------+
| method | amount | user_id |
+--------+--------+---------+
| abc | 10 | 3 |
| xyz | 20 | 4 |
+--------+--------+---------+
+----+---------+--------+
| id | f_name | l_name |
+----+---------+--------+
| 1 | abc | xyz |
| 2 | abc | xyz |
| 3 | abc | xyz |
| 4 | abc | xyz |
| 5 | abc | xyz |
| 6 | abc | xyz |
+----+---------+--------+
退出
+--------+---------+---------+
| amount | result | user_id |
+--------+---------+---------+
| 10 | success | 1 |
| 20 | failed | 2 |
+--------+---------+---------+
+---------+----------+
|w_amount | user_id |
+---------+----------+
| 10 | 1 |
| 20 | 2 |
| 30 | 10 |
+---------+----------+
+--------+--------+---------+
| method | amount | user_id |
+--------+--------+---------+
| abc | 10 | 3 |
| xyz | 20 | 4 |
+--------+--------+---------+
+----+---------+--------+
| id | f_name | l_name |
+----+---------+--------+
| 1 | abc | xyz |
| 2 | abc | xyz |
| 3 | abc | xyz |
| 4 | abc | xyz |
| 5 | abc | xyz |
| 6 | abc | xyz |
+----+---------+--------+
传输
+--------+---------+---------+
| amount | result | user_id |
+--------+---------+---------+
| 10 | success | 1 |
| 20 | failed | 2 |
+--------+---------+---------+
+---------+----------+
|w_amount | user_id |
+---------+----------+
| 10 | 1 |
| 20 | 2 |
| 30 | 10 |
+---------+----------+
+--------+--------+---------+
| method | amount | user_id |
+--------+--------+---------+
| abc | 10 | 3 |
| xyz | 20 | 4 |
+--------+--------+---------+
+----+---------+--------+
| id | f_name | l_name |
+----+---------+--------+
| 1 | abc | xyz |
| 2 | abc | xyz |
| 3 | abc | xyz |
| 4 | abc | xyz |
| 5 | abc | xyz |
| 6 | abc | xyz |
+----+---------+--------+
用户
+--------+---------+---------+
| amount | result | user_id |
+--------+---------+---------+
| 10 | success | 1 |
| 20 | failed | 2 |
+--------+---------+---------+
+---------+----------+
|w_amount | user_id |
+---------+----------+
| 10 | 1 |
| 20 | 2 |
| 30 | 10 |
+---------+----------+
+--------+--------+---------+
| method | amount | user_id |
+--------+--------+---------+
| abc | 10 | 3 |
| xyz | 20 | 4 |
+--------+--------+---------+
+----+---------+--------+
| id | f_name | l_name |
+----+---------+--------+
| 1 | abc | xyz |
| 2 | abc | xyz |
| 3 | abc | xyz |
| 4 | abc | xyz |
| 5 | abc | xyz |
| 6 | abc | xyz |
+----+---------+--------+
预期产出
+--------+---------+---------+----------+---------+
| amount | result | user_id | w_amount | method |
+--------+---------+---------+----------+---------+
| 10 | success | 1 | | |
| 20 | failed | 2 | | |
| | | 1 | 10 | |
| | | 2 | 20 | |
| | | 3 | | abc |
| | | 4 | | xyz |
+--------+---------+---------+----------+---------+
请提前感谢。您可以使用
左连接
s而不是内部连接
s:
SELECT * FROM users u
LEFT JOIN topups t
ON u.id = t.user_id
LEFT JOIN withdraws w
ON u.id = w.user_id
LEFT JOIN transfers tf
ON u.id = tf.user_id
左图将他们加入到用户和数字中,这样做很有效
SELECT
tup.amount, tup.result,
usr.id as user_id,
wd.w_amount,
trans.method
FROM users usr
CROSS JOIN (SELECT generate_series n FROM generate_series(1, 3)) AS nr
LEFT JOIN topups tup ON tup.user_id = usr.id AND nr.n = 1
LEFT JOIN withdraws wd ON wd.user_id = usr.id AND nr.n = 2
LEFT JOIN transfers trans ON trans.user_id = usr.id AND nr.n = 3
WHERE (tup.user_id IS NOT NULL OR wd.user_id IS NOT NULL OR trans.user_id IS NOT NULL)
ORDER BY tup.user_id, wd.user_id, trans.user_id
测试一下
额外:
基于注释的变体请提供示例数据和所需结果。@awsmsid。你的问题不清楚。有多次尝试来回答这个问题,而你似乎拒绝了所有的尝试。没有样本数据、期望的结果和良好的解释,就没有办法回答。陌生人看不懂你的心思。我已经提供了样本数据,请现在检查。对我来说,看起来像一个坏了的数据库。当没有具有该ID的用户时,用户10的取款记录如何存在?这似乎没有道理,应该通过应用适当的外键来实现。@ThorstenKettner为什么用户10的记录不存在?如果我为用户10创建了一个撤销记录并从用户表中删除了该用户,会怎么样?还有一个场景可以在这里假设没有用户id的情况下退出。请不要对该问题投反对票。这是一个有效的问题我有相同的场景。这就是我发布此问题的原因。我尝试了,但它不起作用。它返回所有不属于userscan的记录。我将两列的值合并为一列。假设向用户id 1添加和提取以下内容,并且两者都有update_at,那么我想将updated_at的值(tup.updated_at,,,,wd.updated_at)合并为updated_at,但每次我在“2018-10-15 12:16:09.799762,,,”或“,,2018-10-29 19:06:13.814336”等处获取updated_的单个值时,它都不包含该值我正在尝试连接3个表的更新位置,我可能会选择
连接位置(',',tup.updated\u at,wd.updated\u at)
。但是您希望将表分开,因此这两个值位于不同的行上。合并(tup.updated\u at,wd.updated\u at,trans.updated\u at)
将在该设置中工作,如果您只希望在“@awsmsid”处有1个“updated\u”,则问题是每个表每个用户id都有多个记录。并且为了避免笛卡尔乘积联接(并生成许多行)你需要加入一些额外的内容。看看这个。基本上,它会加入用户id和数量的子查询组。这是我能得到的最接近你尝试做的事情。