合并 MySQL SELECT 语句
Merge MySQL SELECT statements
我有以下tabletbl_crps,注意crp列出现了不止一次, 但 id 和 starts_on 在具有相同 crp 的记录中总是不同的.
id | crp | starts_on |
------------------
1 | 20 | 2020-02-09 |
2 | 31 | 2019-06-05 |
3 | 20 | 2018-01-10 |
4 | 31 | 2021-07-03 |
5 | 58 | 2022-01-01 |
6 | 58 | 2025-02-02 |
我需要提取符合以下条件的记录:
如果对于crp一个或多个过去starts_on的记录存在,那么与具有 crp 的那些记录中最大的 id 必须是 returned
如果 crp 不存在具有过去日期的记录,则在具有该 crp[ 的所有记录中具有最大 ID 的记录=50=]
我可以成功 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[=50= 的记录添加到结果中] 不在第一个结果集中。
可能吗?也许是这样?
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)
)
)
)
我正在使用 MySQL 5.7
我不确定我是否完全理解您的要求,但我认为此查询可以满足您的要求,或者非常接近您的要求:
WITH cteData AS (SELECT b.CRP, MAX(b.ID) AS ID
FROM tbl_crps b
WHERE b.starts_on <= "2020-10-02"
GROUP BY b.CRP)
SELECT *
FROM tbl_crps a
WHERE a.ID IN (SELECT ID
FROM (SELECT b.CRP, b.ID
FROM cteData b
UNION
SELECT d.CRP, d.ID
FROM tbl_crps d
WHERE d.starts_on > "2020-10-02" AND
d.CRP NOT IN (SELECT crp
FROM cteData)) c)
这个returns
id crp starts_on
2 31 2019-06-05
3 20 2018-01-10
5 58 2022-01-01
6 58 2025-02-02
根据我对要求的理解,这似乎是正确的。简而言之
1 - NOT included because its date is in the past ('current' date = 2020-10-02)
and its ID is NOT the greatest among records in the past with that CRP.
2 - included because its date is in the past and its ID is the greatest
among records with that CRP which have dates in the past.
3 - date is in the past, ID is greatest for that CRP with date in the past
4 - NOT included because date is in the future, but CRP is included in recs
from first subquery.
5 - date is in the future, and CRP does not occur in first subquery
6 - date is in the future, and CRP does not occur in first subquery
至于 Akina 对我的新问题的回答(已关闭),这就可以了。
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;
我的解决方案(性能不佳)
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")
)
)
)
我有以下tabletbl_crps,注意crp列出现了不止一次, 但 id 和 starts_on 在具有相同 crp 的记录中总是不同的.
id | crp | starts_on |
------------------
1 | 20 | 2020-02-09 |
2 | 31 | 2019-06-05 |
3 | 20 | 2018-01-10 |
4 | 31 | 2021-07-03 |
5 | 58 | 2022-01-01 |
6 | 58 | 2025-02-02 |
我需要提取符合以下条件的记录:
如果对于crp一个或多个过去starts_on的记录存在,那么与具有 crp 的那些记录中最大的 id 必须是 returned
如果 crp 不存在具有过去日期的记录,则在具有该 crp[ 的所有记录中具有最大 ID 的记录=50=]
我可以成功 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[=50= 的记录添加到结果中] 不在第一个结果集中。
可能吗?也许是这样?
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)
)
)
)
我正在使用 MySQL 5.7
我不确定我是否完全理解您的要求,但我认为此查询可以满足您的要求,或者非常接近您的要求:
WITH cteData AS (SELECT b.CRP, MAX(b.ID) AS ID
FROM tbl_crps b
WHERE b.starts_on <= "2020-10-02"
GROUP BY b.CRP)
SELECT *
FROM tbl_crps a
WHERE a.ID IN (SELECT ID
FROM (SELECT b.CRP, b.ID
FROM cteData b
UNION
SELECT d.CRP, d.ID
FROM tbl_crps d
WHERE d.starts_on > "2020-10-02" AND
d.CRP NOT IN (SELECT crp
FROM cteData)) c)
这个returns
id crp starts_on
2 31 2019-06-05
3 20 2018-01-10
5 58 2022-01-01
6 58 2025-02-02
根据我对要求的理解,这似乎是正确的。简而言之
1 - NOT included because its date is in the past ('current' date = 2020-10-02)
and its ID is NOT the greatest among records in the past with that CRP.
2 - included because its date is in the past and its ID is the greatest
among records with that CRP which have dates in the past.
3 - date is in the past, ID is greatest for that CRP with date in the past
4 - NOT included because date is in the future, but CRP is included in recs
from first subquery.
5 - date is in the future, and CRP does not occur in first subquery
6 - date is in the future, and CRP does not occur in first subquery
至于 Akina 对我的新问题的回答(已关闭),这就可以了。
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;
我的解决方案(性能不佳)
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")
)
)
)