我有以下查询,当一个表的oID(m.oID)作为另一张表的外键(au.fk_oID)多次存在时,返回行。

目标-建立一个查询以返回所有重复的au.fk_oid,其中至少一个具有插入日期在一定范围内

SELECT
    m.oid, m.DrugName, date(m.drugstart), date(m.drugend), au.action, date(au.insert_time)
FROM
    p_medication_auth au
        LEFT JOIN
    p_medication m ON au.fk2_oid = m.oid
WHERE
    au.action IN (5871 , 5873)
        AND DATE(au.insert_time) BETWEEN '2019-01-01' AND CURDATE()
GROUP BY m.oid
HAVING COUNT(au.fk_oid) > 1



当然,使用group by并具有> 1来以这种方式查询日期只会查找au.fk_oid在同一天出现多次的实例。

我需要返回其中au.fk_oid出现多次的实例,其中至少有一个实例的日期(date(au.insert_time))在范围内。

最佳答案

您可以在查询后添加case..when语句,同时从子句的AND DATE(au.insert_time) BETWEEN '2019-01-01' AND CURDATE()部分中删除条件WHERE

SELECT m.oid,
       m.DrugName,
       date(m.drugstart),
       date(m.drugend),
       au.action,
       date(au.insert_time)
  FROM p_medication_auth au
  LEFT JOIN p_medication m
    ON au.fk2_oid = m.oid
 WHERE au.action IN (5871, 5873)
 GROUP BY m.oid
HAVING COUNT(au.fk_oid) > 1
   AND MAX(case when date(au.insert_time) between date'2019-01-01' and curdate() then
                1
           else
                0
           end)=1


Demo

09-11 12:02