cf10 проблема с cfquery maxrows

Я недавно переместил приложение из 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>

2 ответа

Решение

Не уверен, почему это происходит, но вы можете найти mySQL LIMIT пункт в качестве альтернативы. Подробнее здесь: http://dev.mysql.com/doc/refman/5.0/en/select.html

Максроу всегда был чем-то, чего я бы избегал.

Я не уверен, как ColdFusion справляется с этим, но я помню, что слышал (по крайней мере, когда был CF7), что CF фактически получает больший набор данных, а затем разделяет его на уровне сервера CF, а НЕ на уровне базы данных SQL. Как вы можете себе представить, это может иметь нежелательный удар по производительности,

Я не уверен, в чем именно заключается ваша проблема (для меня это звучит как ошибка), но я бы настоятельно рекомендовал заменить атрибут maxrows на комбинацию LIMIT а также OFFSET пункты в вашем SQL (cfquery).

Преимущество заключается в том, что это стандартный SQL и он может работать быстрее, чем CF maxrows, в то же время устраняя вашу проблему.

Другие вопросы по тегам