Развертывание данных ColdFusion - PullRequest
0 голосов
/ 23 декабря 2011

У меня проблемы с детализацией некоторых данных, это структура таблицы

Таблица продуктов

uid_product (уникальный идентификатор)

txt_prod_name(название продукта)

Имя таблицы: tbl_products

Характеристики продукта

uid_feature (уникальный идентификатор)

txt_feature_name (имя функции)Имя таблицы: tbl_features

Назначенные функции продукта

uid_prodf (уникальный идентификатор)

uid_prodf_prodid (внешний ключ для uid_product)

uid_prodf_featid(внешний ключ для uid_features)

Имя таблицы: tbl_prod_features

Один продукт может иметь много функций, поэтому используется таблица tbl_prod_features.

Я создал следующий запрос для получения результатов;

<cfquery name="getFeatureProducts" datasource="#application.dsn#">
SELECT uid_product, txt_prod_name
FROM dbo.tbl_products
WHERE uid_product IN (SELECT (dbo.tbl_product_features.uid_prodf_prodid)
FROM dbo.tbl_product_features
WHERE  uid_prodf_featid IN (<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#arguments.uid_features#" list="yes">))
ORDER BY dbo.tbl_products.txt_prod_name
</cfquery>

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

Если пользователь выбирает;

Функция A = 5 отображаемых продуктов (3 из 5 из этих продуктов содержат функцию B)

Если пользователь затем выбирает;

Функция B = 3 Продукты

В настоящее время при запросе с использованием оператора in он по-прежнему будет получать 5 продуктов.

Моей первой мыслью было создание динамического оператора where с добавлением оператора AND, однако uid_prodf_featid = 5 AND uid_prodf_featid = 6 всегда будет давать 0 результатов.

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

Однако у пользователя есть возможность удалять функции (и в любом порядке), поэтому мне нужно каким-то образом отслеживать идентификаторы продуктов по мере их добавления и удаления.

IЯ уверен, что я слишком усложняю это, но любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

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

Например, если arguments.uid_features всегда содержит уникальные идентификаторы функций, вы можете сделать что-то вроде этого:

SELECT p.uid_product, p.txt_prod_name
FROM   tbl_products p  INNER JOIN tbl_product_features f 
           ON p.uid_product = f.uid_prodf_prodid
WHERE  f.uid_prodf_featid IN ( <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#arguments.uid_features#" list="true"> )
GROUP BY p.uid_product, p.txt_prod_name
HAVING COUNT(f.uid_prodf_featid) = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#ListLen(arguments.uid_features)#">
ORDER BY p.txt_prod_name
0 голосов
/ 23 декабря 2011

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

SELECT 
    a.uid_feature,
    a.txt_feature_name,
    c.uid_product,
    c.txt_prod_name
FROM 
    tbl_features a
INNER JOIN 
    tbl_prod_features b 
    ON 
        b.uid_prodf_featid = a.uid_feature
        <cfif listLen( arguments.uid_features ) NEQ 0>
            AND 
            a.uid_feature IN (<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#arguments.uid_features#" list="yes">)
        </cfif>
INNER JOIN 
    tbl_products c ON c.uid_product = b.uid_prodf_prodid
GROUP BY 
    a.uid_feature
ORDER BY 
    c.txt_prod_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...