我们有多个invStatus值(1-10),并且只想排除一种状态类型(1)但只排除那些超过X天数的那种类型。因此,所有记录都会显示但不是那些invStatus = 1且超过X天的人。 invStatus = 1且小于X天将包含在记录集中。
我是否一般选择所有记录,然后在子查询中过滤那些状态= 1且超过X天的那些记录?
下面的查询使用NOT IN来尝试选择那些要排除的记录,但它不起作用,而且似乎效率低下,因为它需要几秒钟才能执行。
SELECT
tblinventory.invId,
tblinventory.invTitle,
tblinventory.invStatus,
tblhouseinfo.Address,
tblhouseinfo.City,
tblhouseinfo.`State`,
tblhouseinfo.Zip,
tblhouseinfo.Update_date,
CURRENT_DATE() - INTERVAL 10 DAY AS dateEx
FROM
tblinventory
LEFT OUTER JOIN tblhouseinfo ON tblinventory.invId = tblhouseinfo.addInfoID
WHERE
invReleased = 0
AND invStatus NOT IN (SELECT invId from tblhouseinfo WHERE invStatus = 1
AND tblhouseinfo.Update_date < CURRENT_DATE() - INTERVAL 10 DAY )
ORDER BY
`tblhouseinfo`.`Update_date` DESC
我可以在页面级别使用PHP过滤结果,但这似乎也不是很有效,并且更愿意使用最佳实践来执行此任务。
更新: 共有155行。 所有tblhouseinfo.Update_date(时间戳)值均为&#34; 2017-09-06 10:53:17&#34; (8月9日)接受三个我改变测试到&#34; 2017-07-06 10:53:17 &#34; (7月6日)
利用以下建议:
AND NOT (invStatus = 1 AND tblhouseinfo.Update_date > CURRENT_DATE() - INTERVAL 10 DAY )
排除60条记录而不是预期的3条记录。
&#34; 2017年8月28日&#34;是当前结果来自CURRENT_DATE() - INTERVAL 10 DAY应该在10天范围内选择&#34; 2017-09-06 10:53:17&#34;并且只排除&#34; 2017-07-06 10:53:17&#34;
的三个记录最终工作解决方案/查询:
SELECT
tblinventory.invId,
tblinventory.invTitle,
tblinventory.invStatus,
tblhouseinfo.Address,
tblhouseinfo.City,
tblhouseinfo.`State`,
tblhouseinfo.Zip,
tblhouseinfo.Update_date,
CURRENT_DATE() - INTERVAL 10 DAY AS dateEx
FROM
tblinventory
LEFT OUTER JOIN tblhouseinfo ON tblinventory.invId = tblhouseinfo.addInfoID
WHERE
invReleased = 0
AND NOT (invStatus = 1 AND tblhouseinfo.Update_date < CURRENT_DATE() - INTERVAL 10 DAY )
ORDER BY
`tblhouseinfo`.`Update_date` DESC
答案 0 :(得分:2)
SELECT
tblinventory.invId,
tblinventory.invTitle,
tblinventory.invStatus,
tblhouseinfo.Address,
tblhouseinfo.City,
tblhouseinfo.`State`,
tblhouseinfo.Zip,
tblhouseinfo.Update_date,
CURRENT_DATE() - INTERVAL 10 DAY AS dateEx
FROM
tblinventory
LEFT OUTER JOIN tblhouseinfo ON tblinventory.invId = tblhouseinfo.addInfoID
WHERE
invReleased = 0
AND NOT (invStatus = 1 AND tblhouseinfo.Update_date < CURRENT_DATE() - INTERVAL 10 DAY )
ORDER BY
`tblhouseinfo`.`Update_date` DESC
答案 1 :(得分:0)
如果您不知道ID#1(invStatus 1),则不需要从另一个表中选择invID。但是你也可以为#天投入一个AND语句。
我总是使用时间戳(在UNIX中)来记录数据输入/修改。
AND (timestamp >= beginTimestamp AND timeStamp <= endTimestamp)