代码之家  ›  专栏  ›  技术社区  ›  Sampgun

MySQL合并2个结果集,不包括第一个

  •  0
  • Sampgun  · 技术社区  · 4 年前

    我有下表 待定 ,请注意列 C反应蛋白 发生多次,但是 身份证件 开始 相同的记录总是不同的 C反应蛋白 .

    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 |
    

    我需要在以下条件下对记录进行免除:

    1. 如果用于 C反应蛋白 一个或多个过去的记录 开始 存在,然后是那些记录中id最大的一个 C反应蛋白 (过期的)必须退回

    2. 如果用于 C反应蛋白 不存在具有过去日期的记录,那么具有该日期的所有记录中id最大的记录 C反应蛋白

    我可以成功地选择符合以下第一个条件的记录。

    SELECT * FROM tbl_crps AND id IN (SELECT MAX(b.id) FROM tbl_crps b WHERE b.starts_on <= "2020-10-02")

    将返回ID为3和2的记录。

    我需要做的是把那些 开始 不在过去 C反应蛋白 不在第一个结果集中。

    有可能吗?这是干净的方法吗?

    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

    0 回复  |  直到 4 年前
        1
  •  3
  •   Akina    4 年前

    测试

    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;
    

    fiddle

        2
  •  1
  •   Sampgun    4 年前

    好的,现在我终于得到了想要的结果。我只是错过了一些 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
                 )
    )
    

    小提琴,包括阿基娜的尝试

    https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=dd37a7640d1556c624ba1ebd36192ecd