Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SELECT запрос из 2-х таблиц (отношение многие-ко-многим)  [new]
avolik
Member

Откуда:
Сообщений: 222
Извините, случайно нажал ввод и пост опубликовался не завершенным.


Помогите составить грамотно запрос (и даже просто составить), ибо сам я знаю SQL не до такой степени, что б с данной задачей справиться самому.

Задача.

Есть три таблицы с данными:

Category

id | title
------------
0 | красный
1 | синий
2 | желтый
3 | зеленый

User

id | name
------------
0 | Рома
1 | Игорь
2 | Вася
3 | Петр

UserVsCategory


id | catId | usId
------------
0 | 3 | 1
1 | 2 | 3
2 | 0 | 2
3 | 0 | 1
4 | 2 | 2
5 | 1 | 3
6 | 1 | 2
7 | 3 | 2
8 | 1 | 1
9 | 0 | 0

Требуется отобрать всех пользователей из таблицы User, для которых есть хотя бы одна (или больше) записей в таблице UserVsCategory, значение поля catId которой совпадает с любым из значений для некоторого определенного другого пользователя.

К примеру, следует отобрать пользователей, у которых имеется хотя бы одна категория, которая входит в список категорий пользователя Игорь (id = 1).

Мы знаем, что для Игоря в таблице UserVsCategory имеется три записи, а именно он обладает тремя категориями (значения catId: 3, 0, 1).
Так вот, требуется найти всех пользователей, у которых есть хотя бы или зеленый, или красный, или синий, или их комбинации.

Я думаю, для понимающих прогеров я доходчиво пояснил суть дела.

Да, изначально извесно значение User.id и есть список List<int>, который содержит перечень значений для этого пользователя в полях UserVsCtegory.catId.

Спасибо.
10 дек 12, 03:10    [13604074]     Ответить | Цитировать Сообщить модератору
 Re: SELECT запрос из 2-х таблиц (отношение многие-ко-многим)  [new]
avolik
Member

Откуда:
Сообщений: 222
avolik
Да, изначально извесно значение User.id и есть список List<int>, который содержит перечень значений для этого пользователя в полях UserVsCtegory.catId.


хотя это для SQL-щиков и не надо. Достаточно знать исходное значение User.id.
10 дек 12, 03:12    [13604077]     Ответить | Цитировать Сообщить модератору
 Re: SELECT запрос из 2-х таблиц (отношение многие-ко-многим)  [new]
avolik
Member

Откуда:
Сообщений: 222
И, если это не покажется наглостью, хотелось бы получить максимально быстро работающий запрос поскольку вторая и третья таблица могут насчитывать до миллиона записей.
10 дек 12, 03:22    [13604079]     Ответить | Цитировать Сообщить модератору
 Re: SELECT запрос из 2-х таблиц (отношение многие-ко-многим)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
avolik,
catId допускает null?
10 дек 12, 03:35    [13604086]     Ответить | Цитировать Сообщить модератору
 Re: SELECT запрос из 2-х таблиц (отношение многие-ко-многим)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
avolik,
автор
Так вот, требуется найти всех пользователей, у которых есть хотя бы или зеленый, или красный, или синий, или их комбинации.

может уже поздно, но я не догнал
10 дек 12, 04:11    [13604092]     Ответить | Цитировать Сообщить модератору
 Re: SELECT запрос из 2-х таблиц (отношение многие-ко-многим)  [new]
avolik
Member

Откуда:
Сообщений: 222
Нет, catId не допускает NULL.

По поводу "поздно", то это в качестве примера. Вот берем id пользователя 1. Это Игорь. Для Игоря имеется три категории (3, 0, 1).

Значит, нам надо найти всех пользователей, для которых имеются хотя бы по одной категории из этих трех Игоревых. Кто имеет категорию 3 ? Вася с id 2. Значит Вася подходит. С категорией 3 больше никого нет. Но остались еще категории 0 и 1. Кто имеет категорию 0? Пользователи с id 2 , 1 , 0. Это Вася, Игорь, Рома. Но Игорь сразу отпадает так как он есть условия поиска изначально. Вася уже внесен в список. Значит добавляем Рому. Теперь еще осталось проверить по категории 1. Категорию 1 имеет юзер 3, 2 и 1. А это Петр, Вася, Игорь. Значит, добавляем Петра.

В и тоге, для данного примера все пользователи были выбраны.
10 дек 12, 15:44    [13607410]     Ответить | Цитировать Сообщить модератору
 Re: SELECT запрос из 2-х таблиц (отношение многие-ко-многим)  [new]
avolik
Member

Откуда:
Сообщений: 222
catId, как ячейка допускает по определению значение Null, но реально его там никогда не будет поскольку если уже есть запись, то все поля заполнены.
10 дек 12, 15:45    [13607422]     Ответить | Цитировать Сообщить модератору
 Re: SELECT запрос из 2-х таблиц (отношение многие-ко-многим)  [new]
invm
Member

Откуда: Москва
Сообщений: 9402
select
 u.*
from
 Users u
where
 u.usid <> Игорь and
 exists(
  select
   *
  from
   UserVsCategory a join
   UserVsCategory b on b.catid = a.catid and b.usid = Игорь
  where
   a.usid = u.usid
 );
10 дек 12, 16:43    [13608077]     Ответить | Цитировать Сообщить модератору
 Re: SELECT запрос из 2-х таблиц (отношение многие-ко-многим)  [new]
avolik
Member

Откуда:
Сообщений: 222
Спасибо за направление. Сейчас буду пробовать.
10 дек 12, 17:10    [13608320]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить