查询 return 查询完整 return 而不是过滤的查询
Query of Query returning me full return instead of filtered ones
我有这个查询来自原始查询,原始查询有 50 条记录,qoq 应该给我 30 行,但它给了我完整的 50 行,
我在这里做什么
这里是我的查询
<cfquery name="qryResults" dbtype="query">
Select *
From qryResults
Where sDate> {d '2015-01-01'}
OR (
userID = 22
AND isActive = 1
)
OR (
userID = 8
AND isActive = 0
)
OR (
userID = 7
AND isActive = 1
)
</cfquery>
我在这里做错了什么
此问题需要有关检索到的结果集以及原始 50 行结果集中包含的内容的更多详细信息。在不知道这些细节的情况下,很难确定为什么没有行被过滤掉。但是,考虑到您对所有运算符连接条件都使用 OR
,那么会发生的情况是只有一个条件需要满足返回所有 50 行。我将对此进行尝试,并假设罪魁祸首是日期比较,因为其余部分更具体地要求 userID
和 isActive
的正确组合。我最好的“猜测”是您可能需要将 where 子句中的第一个 OR
更改为 AND
,最终结果如下所示。
<cfquery name="qryResults" dbtype="query">
Select *
From qryResults
Where sDate> {d '2015-01-01'}
AND (
userID = 22
AND isActive = 1
)
OR (
userID = 8
AND isActive = 0
)
OR (
userID = 7
AND isActive = 1
)
</cfquery>
对之前的回答补充一点:
检查您的过滤器是否按照您的预期进行。使用 OR
可以很容易地显示出意想不到的结果。 SQL 基本上按顺序读取查询的 WHERE
部分(尽管优化器可以根据需要更改顺序),因此您上面的查询表示为您提供以下行:
1) `sDate > '2015-01-01'`
OR
2) `userID = 22 AND isActive = 1`
OR
3) `userID = 8 AND isActive = 0`
OR
4) `userID = 7 AND isActive = 1`
所以如果 sDate <= '2015-01-01'
那么它会继续检查 userID
和 isActive
。对我来说,它有助于显式地阻止 OR
条件,这样我就可以更容易地看到我正在尝试做的事情`
WHERE sDate > '2015-01-01`
AND (
( userID = 22 AND isActive = 1 )
OR
( userID = 8 AND isActive = 0 )
OR
( userID = 7 AND isActive = 1 )
)
这将使 sDate
成为您查询的必需条件。
我还要指出,在约会方面,你必须注意自己的界限。您上面的查询将排除 January 1, 2015 at 12:00 AM
(如果 sDate
包含时间部分,如果不包含则为一整天)。所以你可能一直在寻找 >=
。另外,请注意日期类型的精度。例如,对于 SQL 服务器,datetime
仅精确到千分之一秒,因此如果事件发生在 Dec 31, 2015 at 23:59:59.998
上,它将在 SQL 中显示为如果它发生在 Jan 1, 2015 at 00:00:00.000
。尤其是日期,请注意边缘情况。
如果你想稍微缩短你的条件,你也可以使用:
WHERE sDate > '2015-01-01'
AND (
( isActive = 0 AND userID = 8 )
OR
( isActive = 1 AND userID IN (22,7) )
)
说 userID IN (22,7)
是 shorthand 对于 userID=22 OR userID=7
。
我有这个查询来自原始查询,原始查询有 50 条记录,qoq 应该给我 30 行,但它给了我完整的 50 行,
我在这里做什么
这里是我的查询
<cfquery name="qryResults" dbtype="query">
Select *
From qryResults
Where sDate> {d '2015-01-01'}
OR (
userID = 22
AND isActive = 1
)
OR (
userID = 8
AND isActive = 0
)
OR (
userID = 7
AND isActive = 1
)
</cfquery>
我在这里做错了什么
此问题需要有关检索到的结果集以及原始 50 行结果集中包含的内容的更多详细信息。在不知道这些细节的情况下,很难确定为什么没有行被过滤掉。但是,考虑到您对所有运算符连接条件都使用 OR
,那么会发生的情况是只有一个条件需要满足返回所有 50 行。我将对此进行尝试,并假设罪魁祸首是日期比较,因为其余部分更具体地要求 userID
和 isActive
的正确组合。我最好的“猜测”是您可能需要将 where 子句中的第一个 OR
更改为 AND
,最终结果如下所示。
<cfquery name="qryResults" dbtype="query">
Select *
From qryResults
Where sDate> {d '2015-01-01'}
AND (
userID = 22
AND isActive = 1
)
OR (
userID = 8
AND isActive = 0
)
OR (
userID = 7
AND isActive = 1
)
</cfquery>
对之前的回答补充一点:
检查您的过滤器是否按照您的预期进行。使用 OR
可以很容易地显示出意想不到的结果。 SQL 基本上按顺序读取查询的 WHERE
部分(尽管优化器可以根据需要更改顺序),因此您上面的查询表示为您提供以下行:
1) `sDate > '2015-01-01'`
OR
2) `userID = 22 AND isActive = 1`
OR
3) `userID = 8 AND isActive = 0`
OR
4) `userID = 7 AND isActive = 1`
所以如果 sDate <= '2015-01-01'
那么它会继续检查 userID
和 isActive
。对我来说,它有助于显式地阻止 OR
条件,这样我就可以更容易地看到我正在尝试做的事情`
WHERE sDate > '2015-01-01`
AND (
( userID = 22 AND isActive = 1 )
OR
( userID = 8 AND isActive = 0 )
OR
( userID = 7 AND isActive = 1 )
)
这将使 sDate
成为您查询的必需条件。
我还要指出,在约会方面,你必须注意自己的界限。您上面的查询将排除 January 1, 2015 at 12:00 AM
(如果 sDate
包含时间部分,如果不包含则为一整天)。所以你可能一直在寻找 >=
。另外,请注意日期类型的精度。例如,对于 SQL 服务器,datetime
仅精确到千分之一秒,因此如果事件发生在 Dec 31, 2015 at 23:59:59.998
上,它将在 SQL 中显示为如果它发生在 Jan 1, 2015 at 00:00:00.000
。尤其是日期,请注意边缘情况。
如果你想稍微缩短你的条件,你也可以使用:
WHERE sDate > '2015-01-01'
AND (
( isActive = 0 AND userID = 8 )
OR
( isActive = 1 AND userID IN (22,7) )
)
说 userID IN (22,7)
是 shorthand 对于 userID=22 OR userID=7
。