如果一个类型在子查询之外,如何选择记录但排除?

时间:2017-09-07 16:35:15

标签: mysql sql

我们有多个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

2 个答案:

答案 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)