2013-12-13 5 views
0

У меня есть 4 таблицы в базе данныхфильтрация записей из базы данных

  1. Users с колоннами Id, Email, Password, Active
  2. InformationData с колоннами Id, Title, Description, Link
  3. Filters с колоннами Id, Keyword, Active
  4. LUserToFilter с колоннами UserId, FilterId

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

Я пробовал этот запрос, но он возвращает только те записи, которые содержат отфильтрованные ключевые слова и не возвращают другие записи.

Create Procedure [dbo].[SP_GetFilteredData] 
@userid int 
as 
begin 
select D.* from Filters f 
inner join LUsersToFilters L on L.FilterId=F.Id 
inner join InformationData D on D.Title like '%'+F.KeyWord+'%' or D.Description like '%'+F.KeyWord+'%' 
where [email protected] 
end 

Любое предложение пожалуйста ..

+1

Side Примечание: вы должны ** ** не использовать 'sp_' префикс для хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

+0

Хорошо, извините за использование sp_ и за английское письмо, но написание английского на этом пути - это моя привычка, я попытаюсь избавиться от него. – Hammad

+0

Я все еще не совсем понимаю, что вы хотите отфильтровать (например, не показывать), а какие строки вы хотите показать. Правильно ли я понял: вы хотите ** показать ** эти строки из «InformationData», которые ** не содержат ** ни одного слова из «Фильтров» в их столбцах названия или описания? –

ответ

1
SELECT D.* FROM InformationData D 
WHERE NOT EXISTS 
    (SELECT * FROM Filters F INNER JOIN LUsersToFilters L ON F.id=L.FilterId 
    WHERE (D.Title LIKE '%'+F.KeyWord+'%' OR D.Description LIKE '%'+F.KeyWord+'%') 
    AND L.userid = @userid) 
0
Create Procedure [dbo].[SP_GetFilteredData] 
@userid int 
as 
begin 
select D.* from Filters f 
    inner join LUsersToFilters L on L.FilterId=F.Id 
    inner join InformationData D on NOT (D.Title like '%'+F.KeyWord+'%') AND NOT (D.Description like '%'+F.KeyWord+'%') 
where [email protected] 
end 
+0

Не работает для меня, но спасибо за ответ. Я решаю свою проблему, а также отправляю ответ. 'SELECT D. * FROM InformationData D ГДЕ НЕ СУЩЕСТВУЕТ (ВЫБРАТЬ * ОТ ФИЛЬТРОВ F INNER JOIN LUsersToFilters L ON F.id = L.FilterId WHERE (D.Title LIKE '%' + F.KeyWord + '%' ИЛИ ​​D.Description LIKE '%' + F.KeyWord + '%') AND L.userid = @userid) ' – Hammad

Смежные вопросы