3

最近、アプリケーションを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設定を削除すると、正常に実行されます。

また、クエリには2つの外部結合があります。

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>
4

2 に答える 2

3

Maxrowsは常に私が避けたいものでした。

ColdFusionがこれをどのように処理するかはわかりませんが、CFが​​実際にはより大きなデータセットを取得し、SQLデータベースレベルではなくCFサーバーレベルで分割することを聞いたのを覚えています(少なくともCF7が登場したとき)。ご想像のとおり、これは望ましくないパフォーマンスの低下をもたらす可能性がありますが、

あなたの正確な問題が何であるかはわかりませんが(私にはバグのように聞こえます)、SQL(cfquery)の句LIMITと句の組み合わせのmaxrows属性を交換することを強くお勧めします。OFFSET

利点は、これが標準SQLであり、とにかくCF maxrowsよりも実際に高速に実行される可能性があると同時に、問題を排除できることです。

于 2012-08-21T17:12:22.373 に答える
3

LIMITなぜそれが起こっているのかはわかりませんが、代わりにmySQL句を見つけることができます。詳細はこちら:http ://dev.mysql.com/doc/refman/5.0/en/select.html

于 2012-08-22T17:04:29.603 に答える