Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> жесткий select мне задали на собеседовании, sql, select 
:(
    Опции темы
the_buddha
Дата 5.10.2010, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 14.9.2007

Репутация: нет
Всего: нет



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


У нас есть таблица 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, так как тока у него в нашей табле, оба резалта по юзер айди есть.

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

Гуру ПОМОГИТЕ.
PM MAIL   Вверх
the_buddha
Дата 5.10.2010, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 14.9.2007

Репутация: нет
Всего: нет



Один из вариантов я допер, но сказали что их 3

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

SELECT group_id
  FROM t1
  WHERE 
    group_id IN (SELECT group_id FROM a_usergroup WHERE user_id = 1)
    AND user_id = 2;
PM MAIL   Вверх
Gluttton
Дата 5.10.2010, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата(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


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


--------------------
Слава Україні!
PM MAIL   Вверх
Frees
Дата 6.10.2010, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 2
Всего: 54



может я что то не понял, но зачем подзапросы?

Код

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




Это сообщение отредактировал(а) Frees - 6.10.2010, 07:19


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Deniz
Дата 6.10.2010, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



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)



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akina
Дата 6.10.2010, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

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 поместить не в условии связывания, а в условии отбора - разницы никакой.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.