Добавление вложенного, внутреннего или подзапроса в существующий запрос - PullRequest
0 голосов
/ 30 января 2012

Я пытаюсь получить правильный результат из запроса и испытываю некоторые трудности, мои продукты отображаются через их категории, подкатегории и связанные категории.Связанные категории - это то, где пользователь может связать продукты с вторичной категорией (для аналогичных продуктов).

Данные детализируются по характеристикам продукта, например, колебания или скольжения и т. Д.

РезультатДетализация функций должна заключаться в том, что если выбран вариант Swings, то должны отображаться только продукты в выбранной категории, подкатегории или связанной категории с Swings.

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

В следующем запросе я получаю продукты со связанными категориями (это прекрасно работает) с использованием вложенного запроса:

<cfquery name="getProductList" datasource="#application.dsn#">
SELECT 
  p.uid_product,
  p.txt_prod_name,
  p.uid_prod_templteid,
  p.txt_prod_metaurl,
  p.txt_prod_h1,
  p.txt_prod_ref,
  p.mon_prod_rrp,
  p.mon_prod_current,
  i.txt_pimg_name,
  i.uid_pimages,
  i.txt_pimg_alt
FROM dbo.tbl_products
  IINNER JOIN tbl_product_images i ON (p.uid_product = i.uid_pimg_prodid)
  WHERE p.uid_prod_webid=<cfqueryparam cfsqltype="cf_sql_integer" value="#application.webid#">
  <!---If! If arguments to uid_subcategory is defined: USAGE! Get sub cats--->
  <cfif Isdefined('arguments.uid_subcategory') AND arguments.uid_subcategory NEQ "">
  AND p.uid_prod_subcatid = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.uid_subcategory#"></cfif>
  AND dbo.tbl_product_images.bit_pimg_primary=<cfqueryparam cfsqltype="cf_sql_bit" value="yes">
  <cfif Isdefined('arguments.uid_categories') AND arguments.uid_categories NEQ "">
  AND p.uid_prod_catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.uid_categories#"> OR
  <!---QUERY! Look for associated categories and deliver product to the page--->
  uid_product IN (SELECT (ac.uid_assoc_prodid)
  FROM tbl_assoc_categories ac
  WHERE ac.uid_assoc_catid=<cfqueryparam cfsqltype="cf_sql_integer" value="#uid_categories#">
  <!---If! If the user selects a subcategory we only want the associated products directly linked to the chosen sub category --->
  <cfif Isdefined('arguments.uid_subcategory') AND arguments.uid_subcategory NEQ "">
  AND ac.uid_assoc_subcatid=<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.uid_subcategory#"></cfif>)</cfif>
  ORDER BY txt_prod_name asc
</cfquery>
      <cfreturn getProductList>
    </cffunction>

Следующий запрос - это то, что я использую для детализации продуктов с использованием функций:

<cfquery name="getFeatureProducts" datasource="#application.dsn#">
SELECT 
  p.uid_product,
  p.txt_prod_name,
  p.uid_prod_templteid,
  p.txt_prod_metaurl,
  p.txt_prod_h1,
  p.txt_prod_ref,
  p.mon_prod_rrp,
  p.mon_prod_current,
  i.txt_pimg_name,
  i.uid_pimages,
  i.txt_pimg_alt
FROM tbl_products p
INNER JOIN tbl_product_images i ON (p.uid_product = i.uid_pimg_prodid)
INNER JOIN tbl_product_features f ON (p.uid_product = f.uid_prodf_prodid)
WHERE  0=0
AND f.uid_prodf_featid IN (<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#arguments.uid_features#" list="yes">)
GROUP BY p.uid_product, p.txt_prod_name, p.uid_product, p.txt_prod_name, p.uid_prod_templteid, p.txt_prod_metaurl, p.txt_prod_h1, p.txt_prod_ref,p.mon_prod_rrp,p.mon_prod_current,i.txt_pimg_name,i.uid_pimages,i.txt_pimg_alt
HAVING COUNT(f.uid_prodf_featid) = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#ListLen(arguments.uid_features)#">
ORDER BY p.txt_prod_name
</cfquery>

В настоящий момент приведенный выше запрос возвращает все продукты без учета категорий, подкатегорий или связанных категорий.Мне нужно иметь возможность добавить функциональность первого запроса во второй запрос.Я могу сделать категорию и подкатегорию хорошо, просто добавив isdefined и оператор SQL;это связанные категории, с которыми я борюсь.Не уверен, как добавить вложенный запрос к предложению WHERE и по-прежнему поддерживать его работу, я пытался поиграть, но не получилось, поскольку он всегда дает неправильные результаты.

Любая помощь приветствуется!

1 Ответ

2 голосов
/ 30 января 2012

Я настроил пример запроса на моем сайте sqlfiddle.com, который демонстрирует ваш вопрос (и мой ответ): http://sqlfiddle.com/#!3/8d051/2

Вот основная идея, включая код CF:

SELECT 
  p.uid_product,
  p.txt_prod_name,
  p.uid_prod_templteid,
  p.txt_prod_metaurl,
  p.txt_prod_h1,
  p.txt_prod_ref,
  p.mon_prod_rrp,
  p.mon_prod_current,
  i.txt_pimg_name,
  i.uid_pimages,
  i.txt_pimg_alt
FROM tbl_products p
 INNER JOIN tbl_product_images i ON (p.uid_product = i.uid_pimg_prodid)
  <cfloop list="#arguments.uid_features#" index="featid">
  INNER JOIN tbl_product_features f#featid# ON
    f#featid#.uid_prodf_prodid = p.uid_product AND
    f#featid#.uid_prodf_featid = <cfqueryparam value="#featid#" cfsqltype="cf_sql_integer">       
  </cfloop>

ORDER BY
  p.txt_prod_name

Этот метод использует объединения для фильтрации результирующего набора, а cfloop - один раз для каждой функции.Это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...