MySQL 合并 2 个结果集,不包括第一个中的记录
MySQL merge 2 result sets excluding records in the first
我有以下tabletbl_crps,注意crp栏出现不止一次, 但是 id 和 starts_on 在具有相同 crp 的记录中总是不同的.
id | crp | starts_on |
------------------
1 | 20 | 2020-02-09 |
2 | 31 | 2019-06-30 |
3 | 20 | 2018-01-10 |
4 | 31 | 2021-07-28 |
5 | 58 | 2022-01-15 |
6 | 58 | 2025-02-19 |
我需要提取符合以下条件的记录:
如果crp有一条或多条过去starts_on的记录存在,则有具有 crp 的记录中最大的 ID(具有过去日期的记录)必须是 returned
如果 crp 不存在具有过去日期的记录,则在具有该 crp[ 的所有记录中具有最大 ID 的记录=49=]
我可以成功 select 记录符合以下第一个条件。
SELECT * FROM tbl_crps
AND id IN (SELECT MAX(b.id) FROM tbl_crps b WHERE b.starts_on <= "2020-10-02")
将 return 记录 ID 为 3 和 2 的记录。
我需要实现的是将 starts_on 不是过去的那些记录添加到结果中,并且 crp 不在第一个结果集中。
可能吗?这是一种干净的方法吗?
SELECT * FROM tbl_crps a
WHERE id IN (
SELECT MAX(a.id) FROM tbl_crps a WHERE a.starts_on <= "2020-10-02"
)
UNION
(
SELECT * FROM tbl_crps b
WHERE id IN (
SELECT MAX(c.id) FROM tbl_crps c WHERE c.starts_on > "2020-10-02"
AND c.crp NOT IN (
SELECT d.crp FROM tbl_crps d
WHERE id IN (
SELECT MAX(e.id) FROM tbl_crps e WHERE e.starts_on <= "2020-10-02")
)
)
)
我正在使用 MySQL 5.7
测试
SELECT id, crp, starts_on
FROM tbl_crps
NATURAL JOIN (SELECT crp, MAX(id) id
FROM tbl_crps
WHERE starts_on < CURRENT_DATE
GROUP BY crp) x
UNION ALL
SELECT id, crp, starts_on
FROM tbl_crps
NATURAL JOIN (SELECT crp, MAX(id) id
FROM tbl_crps
GROUP BY crp
HAVING MIN(starts_on) >= CURRENT_DATE) x;
好的,目前我设法获得了想要的结果。我只是在这里和那里遗漏了一些 GROUP BY
SELECT * FROM tbl_crps a
WHERE id IN (
SELECT MAX(a.id) FROM tbl_crps a WHERE a.starts_on <= "2020-10-02"
GROUP BY a.crp
)
UNION
(
SELECT * FROM tbl_crps b
WHERE id IN (
SELECT MAX(c.id) FROM tbl_crps c WHERE c.starts_on > "2020-10-02"
AND c.crp NOT IN (
SELECT d.crp FROM tbl_crps d
WHERE id IN (
SELECT MAX(e.id) FROM tbl_crps e WHERE e.starts_on <= "2020-10-02"
GROUP BY e.crp)
)
GROUP BY c.crp
)
)
Fiddle,其中包括 Akina 的尝试
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=dd37a7640d1556c624ba1ebd36192ecd
我有以下tabletbl_crps,注意crp栏出现不止一次, 但是 id 和 starts_on 在具有相同 crp 的记录中总是不同的.
id | crp | starts_on |
------------------
1 | 20 | 2020-02-09 |
2 | 31 | 2019-06-30 |
3 | 20 | 2018-01-10 |
4 | 31 | 2021-07-28 |
5 | 58 | 2022-01-15 |
6 | 58 | 2025-02-19 |
我需要提取符合以下条件的记录:
如果crp有一条或多条过去starts_on的记录存在,则有具有 crp 的记录中最大的 ID(具有过去日期的记录)必须是 returned
如果 crp 不存在具有过去日期的记录,则在具有该 crp[ 的所有记录中具有最大 ID 的记录=49=]
我可以成功 select 记录符合以下第一个条件。
SELECT * FROM tbl_crps
AND id IN (SELECT MAX(b.id) FROM tbl_crps b WHERE b.starts_on <= "2020-10-02")
将 return 记录 ID 为 3 和 2 的记录。
我需要实现的是将 starts_on 不是过去的那些记录添加到结果中,并且 crp 不在第一个结果集中。
可能吗?这是一种干净的方法吗?
SELECT * FROM tbl_crps a
WHERE id IN (
SELECT MAX(a.id) FROM tbl_crps a WHERE a.starts_on <= "2020-10-02"
)
UNION
(
SELECT * FROM tbl_crps b
WHERE id IN (
SELECT MAX(c.id) FROM tbl_crps c WHERE c.starts_on > "2020-10-02"
AND c.crp NOT IN (
SELECT d.crp FROM tbl_crps d
WHERE id IN (
SELECT MAX(e.id) FROM tbl_crps e WHERE e.starts_on <= "2020-10-02")
)
)
)
我正在使用 MySQL 5.7
测试
SELECT id, crp, starts_on
FROM tbl_crps
NATURAL JOIN (SELECT crp, MAX(id) id
FROM tbl_crps
WHERE starts_on < CURRENT_DATE
GROUP BY crp) x
UNION ALL
SELECT id, crp, starts_on
FROM tbl_crps
NATURAL JOIN (SELECT crp, MAX(id) id
FROM tbl_crps
GROUP BY crp
HAVING MIN(starts_on) >= CURRENT_DATE) x;
好的,目前我设法获得了想要的结果。我只是在这里和那里遗漏了一些 GROUP BY
SELECT * FROM tbl_crps a
WHERE id IN (
SELECT MAX(a.id) FROM tbl_crps a WHERE a.starts_on <= "2020-10-02"
GROUP BY a.crp
)
UNION
(
SELECT * FROM tbl_crps b
WHERE id IN (
SELECT MAX(c.id) FROM tbl_crps c WHERE c.starts_on > "2020-10-02"
AND c.crp NOT IN (
SELECT d.crp FROM tbl_crps d
WHERE id IN (
SELECT MAX(e.id) FROM tbl_crps e WHERE e.starts_on <= "2020-10-02"
GROUP BY e.crp)
)
GROUP BY c.crp
)
)
Fiddle,其中包括 Akina 的尝试
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=dd37a7640d1556c624ba1ebd36192ecd