来自两个 table 的 UNION 记录和非 NULL 的支持字段(否则支持来自第一个 table 的值)
UNION records from two tables and favor fields that are not NULL (otherwise favor values from first table)
我在各种答案中奋力拼搏,取得了一些进展,但是,还没有找到最终的解决方案。
DB情况:
Table "clients_a":
userid | name
1 | Steve
2 | John
3 | Paul
Table "clients_b":
userid | name
1 | NULL
3 | Jokename
4 | Jessy
想要result/output:
userid | name
1 | Steve
2 | John
3 | Paul
4 | Jessy
事件描述:
userid
在结果中是唯一的(合并)
name
的非 NULL 结果受到青睐
- 如果有两个条目,则 table
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)
参见demo。
结果:
userid
name
1
Steve
2
John
3
Paul
4
Jessy
我在各种答案中奋力拼搏,取得了一些进展,但是,还没有找到最终的解决方案。
DB情况:
Table "clients_a":
userid | name
1 | Steve
2 | John
3 | Paul
Table "clients_b":
userid | name
1 | NULL
3 | Jokename
4 | Jessy
想要result/output:
userid | name
1 | Steve
2 | John
3 | Paul
4 | Jessy
事件描述:
userid
在结果中是唯一的(合并)name
的非 NULL 结果受到青睐- 如果有两个条目,则 table
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)
参见demo。
结果:
userid | name |
---|---|
1 | Steve |
2 | John |
3 | Paul |
4 | Jessy |