Запрос SQL для проверки комбинаций и сопоставления с данной комбинацией - PullRequest
0 голосов
/ 20 июля 2011

У меня есть сценарий в Sql, где я придерживаюсь следующей схемы.

enter image description here

Если у меня есть 3 элемента в таблице элементов, то одна уникальная комбинация всех элементов будетбыть назначенным пользователю.Например:

Элементы: 1 2 3

Тогда комбинации будут: {1}, {2}, {3}, {1,2}, {1,2,3}, {1,3}, {2,3) все являются уникальными комбинациями.Любая из этих комбинаций будет назначена одному пользователю.

Теперь я хочу выяснить, кому принадлежит данная комбинация, как ее найти?Например: я передам список элементов {2,3}, затем он должен вернуть идентификатор пользователя, который имеет эту комбинацию, из таблицы UserItemCombination.{2,3} передается как строка, разделенная запятыми, в SP.В качестве примера я взял 3 элемента, эта таблица может содержать n элементов.Количество пользователей будет зависеть от количества комбинаций.Например: для трех элементов существует 7 комбинаций, поэтому 7 пользователей будут там в таблице пользователей.

Ответы [ 3 ]

2 голосов
/ 20 июля 2011

UserItemCombination будет иметь одну строку для каждого пользовательского элемента, и один пользователь может иметь только одну комбинацию, поэтому, если комбинация запросов равна {2,3}

select userid from user where userid not in 
  (select distinct userid from UserItemCombinations where itemid in 
                 (select itemid from item where itemid not in (2,3));
1 голос
/ 20 июля 2011

Если в UserItemCombinations не слишком много обновлений и производительность нужного запроса достаточно критична, вы должны добавить дополнительное поле в таблицу User, т.е. Items, и создать SP, который заполняет эти значения для каждого пользователя. , Хранимая процедура выберет отсортированные элементы для каждого пользователя в цикле и объединит их в одну строку, чтобы поместить в поле User.Items. Вы также можете включить триггер на UserItemCombinations для INSERT, UPDATE, DELETE и снова пересчитать значение.

Вы также можете создать индекс для этого поля.

0 голосов
/ 20 июля 2011

выберите идентификатор пользователя из UserItemCombination, где itemid в (2,3) и itemid не в (выберите itemid из Item, где itemid отсутствует в (2,3));

...