UNION来自两个表的记录,并支持非NULL字段(否则支持第一个表中的值)



我努力找到了各种答案,并取得了一些进展,但最终的解决方案尚未找到。

DB情况:

表格"clients_ a":

userid | name 
1      | Steve
2      | John
3      | Paul

表格"clients_ b":

userid | name 
1      | NULL
3      | Jokename
4      | Jessy

所需结果/输出:

userid | name 
1      | Steve
2      | John
3      | Paul
4      | Jessy

正在进行的描述:

  • userid在结果中是唯一的(合并)
  • 对于不为NULL的CCD_ 2的结果是有利的
  • 如果有两个条目,则表clients_a中的结果是有利的
  • 所有条目都有一个groupid(见下文),必须将其考虑在内

我尝试过的MySql查询(结果很接近):

尝试1:此查询有效,但不考虑名称。它采用client_a:中的所有名称

SELECT * FROM
(
SELECT userid, name
FROM `client_a`
WHERE groupid = 123
UNION DISTINCT 
SELECT userid, name
FROM `client_b`
WHERE groupid = 123
) AS res
GROUP BY res.userid

尝试2:此查询会创建重复的条目(一个用户ID可能出现两次),但会考虑名称,如图所示:

SELECT o.*, i.* FROM
(
SELECT userid, name 
FROM `client_a`
WHERE groupid = 123
UNION DISTINCT 
SELECT userid, realname 
FROM `client_b`
WHERE groupid = 123

GROUP BY userid
) AS o
LEFT JOIN `client_a` as i on i.userid = o.userid

我也尝试过使用MIN(name),但没有成功。

感谢您的帮助。

您可以使用NOT EXISTS:

SELECT a.userid, a.name 
FROM clients_a a
WHERE a.groupid = 123
AND (name IS NOT NULL OR NOT EXISTS (SELECT 1 FROM clients_b b WHERE b.userid = a.userid))
UNION  
SELECT b.userid, b.name 
FROM clients_b b
WHERE b.groupid = 123
AND NOT EXISTS (SELECT 1 FROM clients_a a WHERE a.userid = b.userid AND a.name IS NOT NULL)

请参阅演示
结果:

userid名称
1Steve
2John
3Paul
4杰西

最新更新