MySQL:连接两个表值 - 一个表存储用户键值和其他存储defaule值

时间:2018-06-08 19:13:19

标签: mysql sql

我想加入两张桌子。

主表包含带键的用户ID及其值

id   | user_id | fk_id |   value  
---------------------------
12   |   1     |   1   |   "0"
13   |   1     |   2   |   "1"
15   |   1     |   3   |   "1"
16   |   2     |   1   |   "0"  

现在我有另一个表存储默认密钥及其值:

id   | fk_id |   value  
-----------------------
10   |   1   |   "1"
11   |   2   |   "0"
12   |   3   |   "1"
13   |   4   |   "0"

我想从默认表中获取未由用户设置的值,其输出应如下所示:

user_id | fk_id |   value  
---------------------------
1       |   1   |   "0"
1       |   2   |   "1"
1       |   3   |   "1"
1       |   4   |   "0"
2       |   1   |   "0" 
2       |   2   |   "0"
2       |   3   |   "1"
2       |   4   |   "0"

实际上我可以通过使用UNION为单个用户执行此操作,但我希望为多个用户实现,如果他们没有设置任何键值,则需要从默认表中获取它。

那么如果没有设置密钥值,如何编写查询以获取默认值和用户ID?

1 个答案:

答案 0 :(得分:1)

使用cross join生成行(用户和默认值的所有组合),然后使用left join来生成默认值。

这看起来像:

select u.user_id, d.fk_id, coalesce(m.value, d.value) as value
from (select distinct user_id from main) u cross join
     defaults d left join
     main m
     on m.user_id = u.user_id and m.fk_id = d.fk_id;