【问题标题】:cf10 issue with cfquery maxrowscfquery maxrows 的 cf10 问题
【发布时间】:2012-08-15 19:15:47
【问题描述】:

我最近将一个应用程序从 cf9 移到了 cf10

运行设置了 maxrows 的查询时,我收到以下错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OPTION SQL_SELECT_LIMIT=1000' at line 1

查询在 cf9 和 cf8 上运行良好。

玩了一下,看起来 cf10 在查询前添加了OPTION SQL_SELECT_LIMIT=1000;,但 mySQL 无法识别它。如果我从查询中取出 maxrows 设置,它运行良好。

另外值得注意的是,查询有两个外连接。

有其他人在迁移到 cf10 时遇到过类似问题吗?

提前感谢您的任何建议

这是完整的查询

<cfquery name="details" datasource="#Application.ds#" maxrows="#arguments.maxrows#">
          SELECT b.booking_id,
                    DATEDIFF(b.check_out,b.check_in) as nights,
                    b.package_id,
                    b.beds_cot,
                    b.date_booked,
                    b.beds_king,
                    b.status,
                    b.tstamp as booking_tstamp,
                    g.ext_ref_id as guest_ext_ref_id,
                    g.title,
                    g.first_name,
                    g.surname,
                    g.full_name,
                    g.tstamp as guest_tstamp,
                    r.room_id,
                    r.ext_ref_id as room_ext_ref_id,
                    r.name as room_name,
                    r.description as room_description,
                    p.package_id,
                    p.ext_ref_id as package_ext_ref_id,
                    p.name as package_name,
                    p.description as package_description,
                    p.date_start as pacakge_date_start,
                    p.date_end as package_date_end

          FROM guest_booking as b 
          JOIN guest as g
          LEFT JOIN room as r ON b.room_id = r.room_id
          LEFT JOIN packages as p on b.package_id = p.package_id

          WHERE b.provider_id = #arguments.provider_id#
            and b.guest_id = g.guest_id
          <cfif isdefined("arguments.status")>
              and b.status = #arguments.status#
          </cfif>
          <cfif isdefined("arguments.booking_id")>
              and b.booking_id = #arguments.booking_id#
          </cfif>

          ORDER BY #arguments.order_by#
        </cfquery>

【问题讨论】:

  • 不确定为什么会这样,但您可能会发现 mySQL LIMIT 子句作为替代。更多信息:dev.mysql.com/doc/refman/5.0/en/select.html
  • 好像是驱动版本和MySQL版本不兼容?我可能会像 Sam 建议的那样使用 LIMIT,而不是试图担心这一点。
  • 谢谢山姆。您建议的 LIMIT 工作正常。也适用于我前进。如果我在一天左右没有收到针对所描述问题的直接解决方案,请作为答案发布,我可以这样标记。再次感谢!
  • @Jason - 我认为 Sam 的建议也是很好的解决方案。 FWIW 我怀疑彼得是对的,因为它对我“MySQL(4/5)”和 MySQL 5.1.62+ 来说工作得很好。
  • 我目前在mysql(4/5)和mySQL5.6.5上运行。我假设 cf10 附带的驱动程序是最新的,而 mySQL 5.6.5 是相当最新的。我很高兴继续使用 LIMIT 子句,但如果这是否是最新驱动程序/数据库的问题,我会很有趣。再次感谢大家!

标签: mysql coldfusion coldfusion-10


【解决方案1】:

不确定为什么会发生这种情况,但您可能会发现 mySQL LIMIT 子句作为替代。更多内容:http://dev.mysql.com/doc/refman/5.0/en/select.html

【讨论】:

    【解决方案2】:

    Maxrows 一直是我避免使用的东西。

    我不确定 ColdFusion 是如何处理这个问题的,但我记得听说过(至少在 CF7 出现时)CF 实际上获得了更大的数据集,然后在 CF 服务器级别而不是在 SQL 数据库级别拆分它.可以想象,这可能会对性能产生不利影响,

    我不确定您的确切问题是什么(对我来说听起来像是一个错误),但我强烈建议您在 SQL (cfquery) 中将 maxrows 属性换成 LIMITOFFSET 子句的组合。

    好处是,这是标准 SQL,实际上可能比 CF maxrows 运行得更快,同时也消除了您的问题。

    【讨论】:

    • 是的,我相信在早期版本中确实如此。但是,他们的错误消息表明 CF10 正在限制记录 on the database side,就像 LIMIT 一样。但除非记录该行为,否则我同意使用 Sam 之前建议的 LIMIT。有趣的是,maxrows 比我想象的要聪明一点 ;-)
    • 啊,好点子!似乎这实际上是一个不错的功能。永远不要自己真正使用它。
    • (编辑)如果它是一致的并记录在案,是的。由于我不确定maxrows 是在数据库中执行还是在CF 中执行,所以从一个版本到下一个版本,LIMIT 可能是更安全的选择;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多