【问题标题】:Coldfusion MySQL Query within a Query查询中的 Coldfusion MySQL 查询
【发布时间】:2016-08-16 19:44:58
【问题描述】:

我正在尝试从为特定用户检索的完整记录集中检索属于特定年份和月份的记录。首先,有问题的字段itemdate是MySql类型的Datetime(例如2016-08-15 20:00:25)。一个用户有 4 行记录:

2016-08-15 20:00:25
2015-06-01 20:25:05
2016-08-15 20:26:00
2016-08-15 23:30:35

特定用户的这些记录通过以下方式检索:

<cfquery datasource="userdatbase"name="reportlist">
select itemid, itemdate, itemvalue
from itemlib
where userid = '#currentuserid#'
</cfquery>

当前年份和月份由以下因素确定:

<cfset thisyear = #Year(Now())#>
<cfset thismonth = #Month(Now())#>

现在过滤原始查询并仅获取当前年份和月份的查询:

    <cfquery dbtype="query" name="detail"> 
        select itemid, itemdate, itemvalue
        from reportlist
        where year(itemdate) = #thisyear#
        and month(itemdate) = #thismonth#
    </cfquery>

我收到以下错误:

执行数据库查询时出错。

Query Of Queries 语法错误。 遇到“年。不正确的条件表达式,应为 [like|null|between|in|comparison] 条件之一,

我已经尝试过这样做:

    <cfquery dbtype="query" name="detail"> 
        select itemid, itemdate, itemvalue
        from reportlist
        where #year(reportlist.itemdate)# = #thisyear#
        and #month(reportlist.itemdate)# = #thismonth#
    </cfquery>

这将消除错误。但是,我在 detail 查询中得到了所有 4 行记录,而不是预期的 3 行。我不希望 2015-06-01 20:25:05 记录被选中,但确实如此。我为此挠头。任何帮助表示赞赏。提前谢谢你。

【问题讨论】:

  • 您确定通过您使用的连接/驱动程序类型支持月/年函数吗? MySQL 似乎支持月/年,所以我认为引擎在解析查询时没有问题。dev.mysql.com/doc/refman/5.5/en/…
  • 但是,我得到了所有 4 行 因为 SQL 查询没有按照您的想法执行...您正在比较两个文字值,例如 @987654327 @。查询中的每一行都将始终为真(或假)。
  • 如果您在原始数据库查询中输入日期范围,您的页面会发生什么情况?
  • @DanBracuk 我需要检查用户是否有任何东西。所以我没有在数据库查询中放置日期范围。仅当用户返回某些内容时,我才执行 QofQ。我相信日期范围将适用于原始数据库查询。问题在于 QofQ。如果有记录返回用户,我想防止再次访问数据库。
  • Q of Q 并不总是比多次 db 命中更好的选择。如果您正在处理大量数据,您可能会遇到内存问题。在您的情况下,情况可能会,也可能不会。另一个选择是使用select count(*) 查询进行检查。这都是一门不精确的科学。

标签: mysql date coldfusion cfquery


【解决方案1】:

coldfusion Query of Queries (QofQ) 不具备 dbms 的全部功能。 QofQ 语法不支持year()

您的第二个查询在语法上是正确的,因为它传入了reportlist.itemdate 的值,这将是查询reportlist第一行itemdate 的值(假设你没有循环reportlist)。 ColdFusion 将此解释为比较两个文字值,而不是比较查询中的行值。

或者,您可以将变量 (fromDate) 设置为所需月份的第一个日期,然后过滤您的查询,其中项目日期为 &gt;= fromDate 和 &lt; fromDate 加上 1 个月。见下文:

<!--- set fromDate to the first date of the month --->
<cfset fromDate = createDate(thisyear, thismonth, 1) />
<cfquery dbtype="query" name="detail"> 
    select itemid, itemdate, itemvalue
    from reportlist
    where itemdate >= <cfqueryparam value="#fromDate#" cfsqltype="cf_sql_date" />
          and itemdate < <cfqueryparam value="#dateAdd('m', 1, fromDate)#" cfsqltype="cf_sql_date" />
</cfquery>

这通过使用 ColdFusion QoQ 中支持的比较器来完成同样的事情。

这里有一些有用的文档:http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec0e4fd-7ff0.html

【讨论】:

  • 谢谢@beloitdavisja 我不知道 YEAR 和 MONTH 在 QofQ 上不起作用,但我认为 MySQL 也有这些功能。为什么 MySQL 函数在我第一次 QofQ 尝试中没有启动?我也不知道 CF 不适用于单个行值,因为它返回 4 行而不是 1 行。如果我有循环,它不会返回 16 行(4x4)吗?这是我第一次使用 QofQ,它把我逼疯了。
  • @Jack MySQL 确实有这些功能。但是,查询的查询在 MySQL 中运行。 QofQ 最常用于过滤或修改内存中数据库查询的结果集。它是一个强大的工具,但可能会令人沮丧,因为它有自己的规则和有限的语法。它不是像 MySQL 这样的全功能数据库查询语言,并且不使用这些数据库查询语言的任何功能,即使结果集来自 MySQL 数据库。
  • 我需要检查用户是否有任何东西 另外值得注意的是,您可能根本不需要多个查询(或 QoQ)。您是否有理由不能在 itemlib 和 reportlist 上使用 JOIN,并在 userID 上对其进行过滤?
  • @Leigh 谢谢 Leigh。报告列表是来自 itemlib 对用户的查询的查询。我不确定在对用户进行初始查询后我会从 JOIN 中得到什么?
  • @Jack - 嗯......那么查询两次能给你带来什么?为什么不在初始数据库查询中应用日期过滤器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2023-03-28
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多