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