Условное количество записей CF

Я пытаюсь сэкономить серверу базы данных несколько запросов, одновременно запрашивая большое количество элементов из нескольких категорий, а затем используя операторы <cfif ... > для фильтрации этих результатов в уникальные таблицы, которые я показываю для каждой категории. Я хочу найти количество записей для каждой из возвращаемых категорий, а не только количество записей всего запроса.

Основной код:

<cfinvoke component="..." method="..." returnvariable="session.queryList">
    ...
</cfinvoke>

<cfoutput #session.queryList#>
    <cfif #category# eq "A">
        [Table for A things]
    </cfif>
    <cfif #category# eq "B">
        [Table for B things]
    </cfif>
    <cfif #category# eq "C">
        [Table for C things]
    </cfif>
</cfoutput>

Я не хочу использовать здесь «ORDER BY category», потому что таблицы на самом деле находятся в разных div, которые мы скрываем и показываем, поэтому нам нужны отдельные таблицы.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы «Таблица для вещей» говорила «Нет результатов», если нет записей, возвращаемых, где категория = «A», но RecordCount, похоже, применяется ко всему запросу. Есть ли способ сказать что-то вроде <cfif #queryList.RecordCount# WHERE #category# eq "A" GT "0">?


person MLynch    schedule 25.06.2018    source источник
comment
QoQ работают, но менее идеальны. Имейте в виду, что они не бесплатны. Таким образом, вы в основном обмениваете дополнительные поездки БД на дополнительные затраты ресурсов для создания нескольких наборов данных в памяти. Я думаю, что это можно сделать в исходном SQL-запросе. 1. Какая у вас СУБД? 2. Как выглядит большой запрос?   -  person SOS    schedule 26.06.2018


Ответы (3)


QoQ может помочь.

<cfinvoke component="..." method="..." returnvariable="session.queryList">
 ...
</cfinvoke>
 <!---then run QoQ on it--->
<cfquery name="catA" dbtype="query">
 select * from session.queryList where category ="A"
</query>
<cfquery name="catB" dbtype="query">
 select * from session.queryList where category ="B"
</query>
<cfif catA.recordcount>
 <cfoutput query="catA">
  [Table for A things]
 </cfoutput>
 <cfelse>
  No Records for A things
</cfif>
<cfif catB.recordcount>
 <cfoutput query="catB">
  [Table for B things]
 </cfoutput>
 <cfelse>
  No Records for B things
</cfif>
person CFML_Developer    schedule 25.06.2018
comment
Это то, о чем я думал раньше, но, должно быть, я что-то напутал, потому что это не работало правильно. Спасибо за предложение и правильное форматирование, это действительно поможет. - person MLynch; 25.06.2018

Я считаю, что вы пытаетесь сделать следующее. <cfoutput> имеет функцию, помогающую группировать результаты запроса, если запрос упорядочен по элементу группировки.

<cfoutput query="#session.queryList#" group="category">
  <h3>Category #category#</h3>
  <table>
    <tr><th>...</th><th>...</th></tr>
    <cfoutput><!--- This cfoutput loops through the each record in the group. --->
      ---rows---
    </cfoutput>
  <table>
</cfoutput>
person rrk    schedule 25.06.2018
comment
Я не совсем пытаюсь сделать такую ​​группировку. Я пытаюсь получить результат запроса, отфильтровать его так, чтобы в каждой конкретной таблице отображались только определенные возвращенные записи, и получить количество записей для этих отфильтрованных результатов. Итак, если у меня есть 500 возвращенных записей, и 100 из них относятся к категории A, я хочу сказать, что если recordCount для категории A равен 0, показать «Нет элементов категории A, но я могу только выяснить, как получить общее количество количество записей запроса. - person MLynch; 25.06.2018
comment
@MLynch - Думаю, вы все еще могли бы сделать это с помощью сгруппированного вывода. Просто установите флаг, чтобы указать, когда ничего не найдено. trycf.com/gist/f15f95f588ac3271d0a52c6a493b2b05/ - person SOS; 25.06.2018

QofQ работает медленно. Вы можете сделать это с помощью одного обращения к mySQL:

SELECT someColumn, category, count(*) AS categoryCount 
FROM theTable
GROUP BY category
ORDER BY category, someColumn

Группировка даст вам количество для каждой категории, которое вы можете использовать в CFML.

<cfoutput query="session.queryList" group="category">
    <cfif categoryCount eq 0>
        No Records for #category#. =(
    </cfif>
    <cfoutput>
        #someColumn#<br>
    </cfoutput>
</cfoutput>
person Jules    schedule 26.06.2018
comment
Это интересная мысль, и она может работать с некоторой дополнительной логикой. Это не будет работать как есть, поскольку count(*) в этом запросе никогда не будет равно 0. @MLynch - Какие СУБД вы используете? Какой запрос используется для возврата нескольких наборов результатов? - person SOS; 26.06.2018
comment
Кроме того, в зависимости от СУБД, вы не можете GROUP BY столбцов меньше, чем вы SELECT обрабатываете. Но вы можете использовать подзапрос или оконную функцию, чтобы получить нужные значения. - person Shawn; 27.06.2018