Sql MariaDB结果集未返回正确的结果

Sql MariaDB结果集未返回正确的结果,sql,join,mariadb,Sql,Join,Mariadb,我真的需要一些帮助来确定我需要运行以返回以下条件的查询: 不要在今天之后向患者提供保留日期 不要向患者提供当月的“最终日期”,除非他们刚刚停止等待 在本月15日之前,不得向患者提供23日之后最后一个月的最终日期 仅显示分配到队列的患者 仅向其家庭用户呈现“家庭患者” 日期和时间字段是DATETIME 表结构 patients - id, name, call_back_date, last_service_date, finalized_date, lock_status queues - i

我真的需要一些帮助来确定我需要运行以返回以下条件的查询:

不要在今天之后向患者提供保留日期 不要向患者提供当月的“最终日期”,除非他们刚刚停止等待 在本月15日之前,不得向患者提供23日之后最后一个月的最终日期 仅显示分配到队列的患者 仅向其家庭用户呈现“家庭患者” 日期和时间字段是DATETIME

表结构

patients - id, name, call_back_date, last_service_date, finalized_date, lock_status

queues - id, name, home_user_id, active

1, test, 2, 1

patient_queue - id, queue_id, patient_id

1, 1, 1

user_queue - id, queue_id, user_id, active
1, 1, 1, 1 


SELECT
    pq.patient_id
        FROM patient_queue pq
        INNER JOIN queues q
            ON pq.queue_id = q.id
        INNER JOIN user_queue uq
            ON uq.queue_id = q.id
        INNER JOIN patients p
            ON pq.patient_id = p.id
        WHERE pq.queue_id = (SELECT
            uq.queue_id
        FROM user_queue uq
        WHERE uq.active = TRUE
        AND uq.user_id = 4)
        AND p.lock_status = FALSE
        AND p.member_status = 'Enrolled'
        OR p.member_status = 'Enrollment'
        AND uq.active = TRUE
        AND q.active = TRUE
        AND p.household_id = NULL
        AND p.call_back_date <= NOW()
        OR p.call_back_date = NULL
        AND (NOW() - p.finalized_date) <= 20
        AND p.finalized_date < NOW()
        OR p.call_back_date = NULL
        AND p.finalized_date = NULL
        OR q.home_user_id = 10
        AND p.call_back_date <= NOW()
        OR q.home_user_id = 10
        AND p.call_back_date = NULL
        AND (NOW() - p.finalized_date) <= 20
        AND p.finalized_date < NOW()
        OR q.home_user_id = 10
        AND p.call_back_date = NULL
        AND p.finalized_date = NULL
        ORDER BY IF(p.call_back_date < NOW(), 0, IF(ISNULL(p.last_service_date), 0.5, p.last_service_date));

我得到的结果不符合顺序,如果我刷新查询,它会循环5次,所以我会得到id 2,然后10,然后5,然后6,然后32,然后它会返回到2,然后重新开始,所以我不知道这是我的回访日期,还是我对这个问题考虑太多了?这不是一个完整的答案,但我可以做一些可能的改进来推动你提出正确的查询

SELECT pq.patient_id
FROM patient_queue pq
INNER JOIN queues q ON pq.queue_id = q.id
INNER JOIN user_queue uq ON uq.queue_id = q.id
INNER JOIN patients p ON pq.patient_id = p.id
第一个问题是,我不明白为什么这需要是一个子查询。删除它并在主查询中使用WHERE条件

    WHERE pq.queue_id = (SELECT
        uq.queue_id
    FROM user_queue uq
    WHERE uq.active = TRUE
    AND uq.user_id = 4)
因此,这是相反的

   WHERE uq.active = TRUE
     AND uq.user_id = 4
     AND p.lock_status = FALSE
在这里,你是混合和或没有括号,这很可能是错误的

    AND p.member_status = 'Enrolled'
    OR p.member_status = 'Enrollment'
应写为

    AND (p.member_status = 'Enrolled' OR p.member_status = 'Enrollment')
下面,您再次遇到了与或相同的问题,但我很难理解如何对它们进行分组,但由于您多次使用或p.call\u back\u date=NULL和或q.home\u user\u id=10,显然您需要使用括号对它们进行分组

    AND uq.active = TRUE
    AND q.active = TRUE
    AND p.household_id = NULL
    AND p.call_back_date <= NOW()
    OR p.call_back_date = NULL
    AND (NOW() - p.finalized_date) <= 20
    AND p.finalized_date < NOW()
    OR p.call_back_date = NULL
    AND p.finalized_date = NULL
    OR q.home_user_id = 10
    AND p.call_back_date <= NOW()
    OR q.home_user_id = 10
    AND p.call_back_date = NULL
    AND (NOW() - p.finalized_date) <= 20
    AND p.finalized_date < NOW()
    OR q.home_user_id = 10
    AND p.call_back_date = NULL
    AND p.finalized_date = NULL
    ORDER BY IF(p.call_back_date < NOW(), 0, IF(ISNULL(p.last_service_date), 0.5, p.last_service_date));
可能相关,但请注意,现在还包括一个时间,因此根据日期列中存储的内容,将它们与现在进行比较可能无法按预期工作。

日期算术错误:

(NOW() - p.finalized_date) <= 20
或仅谈论日期,而非日期时间:

p.finalized_date >= CURDATE() - INTERVAL 20 DAY
同时,这是可以的:

p.call_back_date <= NOW()  -- meaning that the callback dates is at or before this instant.
如果你是说

a AND (b OR c) AND d
那么你必须使用帕伦斯。这显然是需要的:

    AND p.call_back_date <= NOW()
    OR p.call_back_date = NULL
    AND ...


在性能等方面没有差别。

你的上一句话相当含糊。IFNULL将简化订单的第二部分。根据筛选的文本描述,您的where条件太长。请阅读并执行。展示你能正确处理的最大的子问题&扩展它时遇到的第一个问题。谢谢,我会做出更改,看看会发生什么
a AND (b OR c) AND d
    AND p.call_back_date <= NOW()
    OR p.call_back_date = NULL
    AND ...
    AND (p.call_back_date <= NOW()  OR  p.call_back_date = NULL)
    AND ...
    AND (p.member_status = 'Enrolled' OR p.member_status = 'Enrollment')
    AND p.member_status IN ('Enrolled', 'Enrollment')