Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > жесткий select мне задали на собеседовании


Автор: the_buddha 5.10.2010, 22:26
Всем привет, на собеседовании мне дали решить один как мне кажется жесткий задач.


У нас есть таблица t1(user_id, group_id) я конечно объясню что это за таблица, но если чесно это все не важно, важно сделать выборку именно по ней,  по идее есть таблиц юзер и есть таблица группа, и наша таблица t1 для отношения многие ко многим

Так вот надо выбрать из нашей таблицы t1 все group_id у которых user_id равно 1, 2 (к примеру, это же у нас внеш ключи к таблице юзер) причем равно одновременно пример с данными нашей таблички


user_id , group_id

     1              1
     2              1
     1              2
     2              3

Вот нужно составить запрос, которые вернет один резульат group_id равный 1, так как тока у него в нашей табле, оба резалта по юзер айди есть.

Да, кстати мне еще сказали что данная задача решается, аж тремя возможными вариантами.

Гуру ПОМОГИТЕ.

Автор: the_buddha 5.10.2010, 22:43
Один из вариантов я допер, но сказали что их 3

вот мой первый вариант

SELECT group_id
  FROM t1
  WHERE 
    group_id IN (SELECT group_id FROM a_usergroup WHERE user_id = 1)
    AND user_id = 2;

Автор: Gluttton 5.10.2010, 23:19
Цитата(the_buddha @  5.10.2010,  22:26 Найти цитируемый пост)
Гуру ПОМОГИТЕ. 

Пока они не подошли выскажу свое мнение:
Код

select group_id
from (
    select group_id from t where user_id = 1
    union all
    select group_id from t where user_id =2
)   as s
    having count(group_id)>1


Код

select group_id
from t
    where exists (select group_id from t where user_id = 1)
    and exists (select group_id from t where user_id =2)


Код

select a.group_id
from 
    (select group_id from t where user_id = 1)
    as a
    inner join 
    (select group_id from t where user_id = 2)
    as b
    on a.group_id = b.group_id


Ничего не проверял на сервере, поэтому могут быть ошибки, но идея, я думаю, просатривается.

Автор: Frees 6.10.2010, 07:00
может я что то не понял, но зачем подзапросы?

Код

SELECT T1.GROUP_ID--, count(t1.USER_ID)
FROM T1
WHERE T1.USER_ID in ( 1, 2)
GROUP BY 1
having  count(t1.USER_ID) >= 2



Автор: Deniz 6.10.2010, 07:39
Gluttton, первый запрос наверно можно упростить:
Код
select group_id
from (
    select group_id from t where user_id in (1, 2)
  )   as s
group by group_id
having count(group_id)>1
только вот проверить его не смогу select ... from (select ...) не работает.
Вот еще один вариант (вроде похоже на правду):
Код

select group_id
from t8
where user_id in (1, 2)
group by group_id
having count(distinct user_id) = 2
 число для сравнения = кол-ву значений в where.

Добавлено через 6 минут и 49 секунд
Gluttton, второй запрос неправильный, правильнее так:
Код
select distinct t1.group_id
from table1 t1
    where exists (select 1 from t8 where user_id = 1 and t1.group_id = idg)
      and exists (select 1 from t8 where user_id = 2 and t1.group_id = idg)

Автор: Akina 6.10.2010, 07:51
Код

select t1.group_id
from table t1
inner join table t2
on t1.group_id=t2.group_id
and t1.user_id=1
and t2.user_id=2

Это при условии, что нет дублирования записей и что вывести надо и запись о группе, в которой кроме юзеров 1 и 2, могут присутствовать и другие юзеры. Если нет - следует дополнительно группировать по t1.group_id и проверять count(t1.group_id)=1.

Добавлено через 2 минуты и 17 секунд
PS. В данном конкретном случае можно проверки tN.group_id поместить не в условии связывания, а в условии отбора - разницы никакой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)