ВЫБЕРИТЕ вопрос - PullRequest
       1

ВЫБЕРИТЕ вопрос

2 голосов
/ 23 сентября 2011

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

Таблицы здесь: «Особенности», «Категория» и «Маркетинг». Feature соединяется с Category с CategoryID (названным CategoryID в Feature & в таблицах Category), а Feature соединяется с Marketing с FeatureID (называемым MarketingData в таблице Marketing)

Параметр MarketingTypeID, равный 3, указывает таблице «Маркетинг» искать элемент и переходит к таблице элементов. Оператор select работал до того, как я добавил в него материал таблицы Category, поэтому, очевидно, я неправильно закодировал эту часть. Может ли кто-нибудь помочь мне заставить работать оператор select?

Это работает:

SELECT DISTINCT FeatureID, FeatureTitle 
FROM Feature 
WHERE FeatureID NOT IN 
(SELECT m.MarketingData FROM Marketing 
WHERE MarketingTypeID = 3 AND ProductID = @ProductID) 
ORDER BY FeatureTitle

Это не:

SELECT DISTINCT f.FeatureID, f.FeatureTitle FROM Feature f 
INNER JOIN Category c 
ON c.CategoryID = f.CategoryID 
WHERE f.CategoryID = @CategoryID 
AND f.FeatureID NOT IN 
(SELECT m.MarketingData FROM Marketing m 
WHERE m.MarketingTypeID = 3 AND m.ProductID = @ProductID) 
ORDER BY f.FeatureTitle

enter image description here

EX: FeatureID # 23, веб-учебники, имеет ID категории 32 ... эта категория называется платформами и находится в таблице категорий. FeatureID # 23 НЕ находится в таблице Marketing, поэтому НЕ связан с выбранным продуктом, который является ProductID # 1. Мне нужен флажок с надписью Web Tutorials для отображения в модале. Как я уже говорил, было прекрасно, когда я добавил все материалы о категории, связанные с продуктом, который был выбран пользователем.

ОБНОВЛЕНИЕ: Понятия не имею, почему я пытался написать это утверждение так, как оно у меня было. Я понял, что это было намного легче, чем я первоначально думал, и изменил утверждение. Это работает сейчас, спасибо за помощь всем! Я изменил оператор SELECT на:

"SELECT DISTINCT f.FeatureID, f.FeatureTitle 
FROM Feature f 
LEFT JOIN Category c ON c.CategoryID = f.CategoryID 
WHERE f.CategoryID IN 
(SELECT CategoryID FROM CategoryLink 
WHERE ProductID = @ProductID) 
AND f.FeatureID NOT IN 
(SELECT m.MarketingData FROM Marketing m WHERE m.MarketingTypeID = 3 
AND m.ProductID = @ProductID) 
ORDER BY f.FeatureTitle"

Ответы [ 2 ]

4 голосов
/ 23 сентября 2011

Если вы сравните это JOIN:

 FROM Feature f INNER JOIN Category c ON c.CategoryID = f.CategoryID 

со структурой базы данных, вы увидите, что вы пытаетесь использовать столбец (Feature.CategoryID), которого нет в вашей базе данных.На самом деле, при существующем дизайне вам придется написать довольно сложный запрос, чтобы получить от Feature до Category.

Это может быть правдой, однако существует более прямая связь междуКатегории и функции, которые они могут иметь, еще не представлены в вашей базе данных.Если это правда, вам нужно добавить таблицу CategoryFeatureLink, затем использовать эту таблицу вместе с Category и Feature в трех направлениях JOIN.

0 голосов
/ 24 сентября 2011

Это мой второй ответ на этот вопрос, преследующий другую проблему с запросом.

Является ли поле MarketingData NULLable? Если это так, и если ваш подзапрос возвращает значения NULL, ваш оператор может оцениваться не так, как вы ожидаете, в зависимости от определенных настроек базы данных.

Теоретически, это не будет иметь никакого значения для двух запросов, поскольку они оба содержат один и тот же подзапрос, но если вам довелось тестировать с другим @ProductID, вы могли столкнуться только с проблемой конкретного продукта.

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